详解webapp页面滚动卡顿的解决办法


Posted in HTML / CSS onDecember 26, 2018

手机浏览器在滚动当前页面(还可能是缩放页面)时,由于默认行为被阻止,导致页面被迫静止,导致用户使用体验差,感觉滚动页面有停顿感。

具体一点的解释:由于 touchstart 事件对象的 cancelable 属性为 true,也就是说它的默认行为可以被监听器通过 preventDefault() 方法阻止。但浏览器无法预先知道一个监听器会不会调用 preventDefault(),它能做的只有等监听器执行完后再去执行默认行为,而监听器执行是要耗时的,有些甚至耗时很明显,这样就会导致页面卡顿。即便监听器是个空函数,也会产生一定的卡顿,毕竟空函数的执行也会耗时。

addEventListener的useCapture参数

基本概念:xxx.addEventListener('事件名', function(xxx){xxx}, useCapture).

第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数为 useCapture.

下面就来看看这个东西是个啥意思,直接举例子说明更加直观。

<div id="level1">
  <div id="level2">
    <div id="level3">请在此点击</div>
  </div>
</div>
<div id="info">
</div>
var level1 = document.getElementById("level1");
var level2 = document.getElementById("level2");
var level3= document.getElementById("level3");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "level1" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "level2" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "level3" + "<br>"; }, false);

根据上述代码来看这个 useCapture 为 true 和 false的作用效果:

全为 false 时,触发顺序为:level3、level2、level1
全为 true 时,触发顺序为:level1、level2、level3
level1为 true,其他为 false 时,触发顺序为:level1、level3、level2
level2为 true,其他为 false 时,触发顺序为:level2、level3、level1
level3为 true,其他为 false 时,触发顺序为:level3、level2、level1
level1为 false,其他为 true时,触发顺序为:level2、level3、level1
level2为 false,其他为 true时,触发顺序为:level1、level3、level2
level3为 false,其他为 true时,触发顺序为:level1、level2、level3

由上述结果得出如下结论:

true 的触发顺序总是在 false 之前;
如果多个均为 true,则外层的触发先于内层;
如果多个均为 false,则内层的触发先于外层。

passive属性来控制事件行为

使用方式如下

addEventListener('事件名', function(xxx){xxx}, {
    capture: false,
    passive: false,
    once: false
})

三个属性都是布尔类型的开关,默认值都为 false。

capture:等价于以前的 useCapture 参数;
once:就是表明该监听器是一次性的,执行一次后就被自动 removeEventListener 掉;
passive:用于webapp的touch事件

据了解,在手机浏览器使用事件的时候,有 80% 的滚动事件监听器是不会阻止默认行为的,也就是说大部分情况下,浏览器是白等了。所以,passive 监听器诞生了,passive 的意思是“顺从的”,表示它不会对事件的默认行为说 no,浏览器知道了一个监听器是 passive 的,它就可以在两个线程里同时执行监听器中的 JavaScript 代码和浏览器的默认行为了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3中伪元素::before和::after的用法示例
Sep 18 HTML / CSS
使用css实现android系统的loading加载动画
Jul 25 HTML / CSS
CSS3实现莲花绽放的动画效果
Nov 06 HTML / CSS
HTML5网页音乐播放器的示例代码
Nov 09 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
Oct 30 HTML / CSS
HTML5 创建canvas元素示例代码
Jun 04 HTML / CSS
HTML5微信播放全屏问题的解决方法
Mar 09 HTML / CSS
Html5新增标签有哪些
Apr 13 HTML / CSS
Html5应用程序缓存(Cache manifest)
Jun 04 HTML / CSS
浅析HTML5中的download属性使用
Mar 13 HTML / CSS
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
May 10 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
Dec 21 #HTML / CSS
HTML5的postMessage的使用手册
Dec 19 #HTML / CSS
使用html2canvas.js实现页面截图并显示或上传的示例代码
Dec 18 #HTML / CSS
Canvas globalCompositeOperation
Dec 18 #HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
Dec 12 #HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
Dec 10 #HTML / CSS
html5+css如何实现中间大两头小的轮播效果
Dec 06 #HTML / CSS
You might like
PHP 木马攻击防御技巧
2009/06/13 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python数据类型学习笔记
2016/01/13 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
白酒市场营销方案
2014/02/25 职场文书
五一劳动节活动记录
2014/03/23 职场文书
MySQL基础(二)
2021/04/05 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
5道关于python基础 while循环练习题
2021/11/27 Python
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers