在写webapp页面的时候,Chrome 提醒 web
[Violation] Added non-passive event listener to a scroll-blocking 'touchstart' event. Consider marking event handler as 'passive' to make the page more responsive.
翻译过来以下:浏览器
违反:没有添加被动事件监听器来阻止'touchstart'事件,请考虑添加事件管理者'passive',以使页面更加流畅。app
出现如上提示这多是因为console的过滤器选择了Verbosewebapp
Verbose-冗长,就是事无具细的把全部log显示出来ide
Info-显示开发者自定义的log及错误信息函数
Warnings-显示危险信息性能
Errors-显示错误信息优化
通常默认的是Info,不会提示这个提醒,虽然这并不影响代码的正常运行,但 是既然提醒了仍是弄明白是什么缘由的好一些。spa
这是由于Chrome51版本之后,Chrome增长了新的事件捕获机制-Passive Event Listeners翻译
Passive Event Listeners就是告诉前页面内的事件监听器内部是否会调用preventDefault函数来阻止事件的默认行为,以便浏览器根据这个信息更好地作出决策来优化页面性能。当属性passive的值为true的时候,表明该监听器内部不会调用preventDefault函数来阻止默认滑动行为,Chrome浏览器称这类型的监听器为被动(passive)监听器。目前Chrome主要利用该特性来优化页面的滑动性能,因此Passive Event Listeners特性当前仅支持mousewheel/touch相关事件
之前的事件捕获代码以下:
document.addEventListener("click", fn, false/true)
第三个参数决定了fn函数是在冒泡仍是捕获阶段触发。
如今第三个参数不但能够是布尔值,还但是一个对象
document.addEventListener("mousewheel", fn, {passive: true})
因为passive对象只在Chrome浏览器中支持,因此这里须要作一个兼容处理
var passiveSupported = false; try { var options = Object.defineProperty({}, "passive", { get: function() { passiveSupported = true; } }); window.addEventListener("test", null, options); } catch(err) {} function fn() { console.log("fn") } document.addEventListener("mousewheel", fn, passiveSupported ? { passive: true } : false)
再看Chrome调试会发现,Chrome已经不要提醒让人头的提醒。