今天我看源码,因为一边看一边记笔记所以看的慢。突然发现一个特性。所以单独开一篇。感觉是一个秀 bigger 的特性,如果有一天面试官问你发现优化页面的时候,你提出可以检查浏览器是否可以使用该特性。提升滚动流畅度。
passive
var supportsPassive = false;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, ‘passive’, ({
get: function get () {
/* istanbul ignore next */
supportsPassive = true;
}
})); // https://github.com/facebook/flow/issues/285
window.addEventListener(‘test-passive’, null, opts);
} catch (e) {}
}
这里核心是检查是否支持 Passive,tips
1, passive 是什么?Chrome 提出的一个新的浏览器特性:Web 开发者通过一个新的属性 passive 来告诉浏览器,当前页面内注册的事件监听器内部是否会调用 preventDefault 函数来阻止事件的默认行为,以便浏览器根据这个信息更好地做出决策来优化页面性能。当属性 passive 的值为 true 的时候,代表该监听器内部不会调用 preventDefault 函数来阻止默认滑动行为,Chrome 浏览器称这类型的监听器为被动(passive)监听器。目前 Chrome 主要利用该特性来优化页面的滑动性能,所以 Passive Event Listeners 特性当前仅支持 mousewheel/touch 相关事件
2, Passive Event Listeners 特性是为了提高页面的滑动流畅度而设计的,页面滑动流畅度的提升,直接影响到用户对这个页面最直观的感受。这个不难理解,想象一下你想要滑动某个页面浏览内容,当你用鼠标滚轮或者用手指触摸屏幕上下滑动的时候,页面并没有按你的预期进行滚动,此时你内心往往会感觉到一丝不爽,甚至想放弃该页面。Facebook 之前做了一项试验,他们将页面滑动的响应刷新率从 60FPS 降低到 30FPS 的时候,发现用户的参与度急速下降。
3,passive 的简单实现
function handler(event) {
console.log(event.type); // log event type
}
document.addEventListener(“mousewheel”, handler, {passive:true});