相信若是用谷歌浏览器作移动端页面的时候 浏览器
用touch事件的时候应该遇到过这个东东吧ide
documet.addEventListener("touchstart",function(){性能
console.log(123);spa
});翻译
[Violation] Added non-passive event listener to a scroll-blocking
'touchstart'
event. Consider marking event handler as
'passive'
to make the page more responsive.
3d
翻译过来就是code
违反:没有添加被动事件监听器来阻止'touchstart'事件,请考虑添加事件管理者'passive',以使页面更加流畅。对象
出现如上提示这多是因为console的过滤器选择了Verboseblog
因而你检查了代码 发现并无问题 那么这究竟是啥呢事件
强迫症的我 上网百度了 一下
因而就有所了解
之前的监听器都是这样的
element.addEventListener("touchstart",fn,true|false);
true 是事件捕获阶段执行
false 是事件冒泡阶段执行
这里不细说
没有第三个参数的时候默认为false
第三个参数还能够是对象
element.addEventListener("touchstart",fn,
{
capture: Boolean, passive: Boolean, once: Boolean}
});
第一个参数的意思 true|false 事件捕获阶段冒泡阶段
第二个参数 true|flase 不能调用 | 能够调用preventDefault()
第三个参数 once true|false 只能执行一次fn | 不限制
那问题来了 为何要使用对象 而且要用passive呢 是由于事件里面的fn执行时须要时间滴
你想呀 执行代码的时候 好比 mousewheel 的时候 鼠标滚轮让滚动条动 但是你调用
preventDefault() 取消了事件的默认行为 那你说 它到底该动仍是不动,浏览器一脸懵逼
它只有在fn里面的代码执行完以后才会知道到底要不要取消默认行为 这样等待的时间不就
白白浪费掉了吗 是性能低下 在执行fn以前就告诉 它 是否取消默认行为
这不就你知我长短 我知你深浅了吗
因为这个只有谷歌有 因此兼容处理 不认识的大神写的
try{
var passiveSupported=false;
var opts=Object.defineProperty({},"passive",{
get:function(){
passiveSupported=true;
}
});
document.addEventListener("本身决定",null,opts);
}
catch(e){
}
document.addEventListener("touchstart",fn,passiveSupported?{"passive":true}:false);
这么看不得劲
挨张图片
有的人可能不知道 Object.defineProperty()
我就说在这须要用知道的
就是当访问{} 的 passive 属性的时候 执行get方法
{} 不就是new Object() 的语法糖吗
console.log(options) 就是;
因此你明白了吧
当触发这个的时候 就是访问options的passive 属性 而后passiveSupported=true
“test” 你随意设置
嗯 差很少了