Passive Event Listeners——让页面滑动更加流畅的新特性

Passive Event Listeners - 被动事件监听器

在基于 Element-ui 写项目的时候,Chrome 提醒:
[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive. See https://www.chromestatus.com/feature/5745543795965952

翻译过来如下:
违反:没有添加被动事件监听器来阻止'touchstart'事件,请考虑添加事件管理者'passive',以使页面更加流畅。

出现如上提示这可能是由于console的过滤器选择了 Verbose;

1、Verbose - 冗长,就是事无具细的把所有log显示出来
2、Info - 显示开发者自定义的log及错误信息
3、Warnings - 显示危险信息
4、Errors - 显示错误信息

一般默认的是Info,不会提示这个提醒,虽然这并不影响代码的正常运行,但是既然提醒了还是弄明白是什么原因的好一些。

原因是什么呢?

原因是 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已经不要提醒让人头的提醒。


以上就是对Passive Event Listeners——让页面滑动更加流畅的新特性的相关介绍,希望对您学习javascript有所帮助。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 1,920评论 1 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 140,139评论 20 594
  • 对孩子来说父母的帮助是必要的 。但是 ,在孩子的生活里 ,父母无论任何时候 ,都只应充当配角 ,让孩子成为自...
    HeleneHe阅读 167评论 0 2
  • 很多经常咨询我们的人,都会问一个问题:“我已经想改变了,但不知道如何拓展交际圈,又懒得动,又不知道怎么做?怎么办”...
    迎刃阅读 1,185评论 4 7
  • Python web 框架很多,Django 和 Flask 是其中非常有意义的代表,两个都初步尝试,区别很明显。...
    废柴社阅读 53评论 0 0