详解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中引入多种自定义字体font-face
Jun 12 HTML / CSS
HTML5仿手机微信聊天界面
Mar 18 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
Oct 20 HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
Mar 25 HTML / CSS
【HTML5】Canvas绘制简单图片教程
May 13 HTML / CSS
html5.2 dialog简介详解
Feb 27 HTML / CSS
canvas生成带二维码海报的踩坑记录
Sep 11 HTML / CSS
详解如何获取localStorage最大存储大小的方法
May 21 HTML / CSS
纯CSS实现酷炫的霓虹灯效果
Apr 13 HTML / CSS
CSS3实现的侧滑菜单
Apr 27 HTML / CSS
纯CSS实现一个简单步骤条的示例代码
Jul 15 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学习 变量使用总结
2011/03/24 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python continue继续循环用法总结
2018/06/10 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Django视图类型总结
2021/02/17 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
python 实现有道翻译功能
2021/02/26 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
初入社会应届生求职信
2013/11/18 职场文书
就业自我评价
2014/02/04 职场文书
个人对照检查材料
2014/02/12 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL