如果我不测试被动事件侦听器支持,会发生什么?

5

Chromium提醒我事件监听器不是被动的。

好吧。

我不会在那里使用event.preventDefault(),所以我愿意将其变成被动的。

但是,当我阅读详细说明时,示例使用了Modernizr检查属性是否可用。

addEventListener(document, "touchstart", function(e) {
  }, Modernizr.passiveeventlisteners ? {passive: true} : false);

但是我没有安装Modernizr,并且为这个非常特殊的用例设置起来很麻烦。

所以问题是:如果我盲目地写:

$el.addEventListener('touchstart', () => {}, {passive: true})

在旧浏览器中会发生什么?

我猜对象可能会被计算为true,这是正确的吗?不会出现错误吗?

1个回答

10

{passive: true}将被评估为true,这样应该可以消除Chromium的警告,但根据您提供的链接,它可能会对旧版浏览器产生“意想不到的结果”。

我认为这种方法(在该链接中还建议)非常好,而且不需要任何其他库:

// Test via a getter in the options object to see if the passive property is accessed
var supportsPassive = false;
try {
  var opts = Object.defineProperty({}, 'passive', {
    get: function() {
      supportsPassive = true;
    }
  });
  window.addEventListener("testPassive", null, opts);
  window.removeEventListener("testPassive", null, opts);
} catch (e) {}

// Use our detect's results. passive applied if supported, capture will be false either way.
elem.addEventListener('touchstart', fn, supportsPassive ? { passive: true } : false);

1
谢谢。我仍然觉得这很繁重,但我想没有选择。如果浏览器本身包含每个功能的一些检查,那就更好了。 - Augustin Riedinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接