详解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 相关文章推荐
45个非常奇妙的CSS3 特性应用示例
Jan 01 HTML / CSS
css3中transition属性详解
Sep 02 HTML / CSS
CSS3过渡transition效果实例介绍
May 03 HTML / CSS
利用CSS3实现的文字定时向上滚动
Aug 29 HTML / CSS
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
Mar 02 HTML / CSS
css3 实现元素弧线运动的示例代码
Apr 24 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
Jan 05 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
Dec 13 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
Apr 24 HTML / CSS
利用Storage Event实现页面间通信的示例代码
Jul 26 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
Oct 08 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
Aug 20 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
php中iconv函数使用方法
2008/05/24 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
canvas时钟效果
2017/02/16 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
跟老齐学Python之编写类之三子类
2014/10/11 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python调用百度语音识别api
2018/08/30 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
支部鉴定材料
2014/06/02 职场文书
国际贸易专业求职信
2014/06/04 职场文书
村级个人对照检查材料
2014/08/22 职场文书
维稳工作情况汇报
2014/10/27 职场文书
继承权公证书范本
2015/01/23 职场文书
端午节活动总结报告
2015/02/11 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
大学生暑假实习总结
2015/07/13 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Python中with上下文管理协议的作用及用法
2022/03/18 Python