[Intervention] Unable to preventDefault inside passive event listener due to target being treated as

相信若是用谷歌浏览器作移动端页面的时候  浏览器

用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”  你随意设置    

 

嗯  差很少了

相关文章
相关标签/搜索