如何检查侦听器事件是否为被动事件?

时间:2018-05-01 19:55:34

标签: javascript dom w3c dom-events

我正在编写一个手势/动作库,它也管理事件监听器和触发。我已经实现了我的lib来支持通过API设置被动侦听器的手势对象,如下所示: while (File.is_open()) { File >> c; Dealers.push_back(new CDealer(c)); } 。我的lib支持多种手势,设置多个被动,无论是被动还是非被动。 lib将确保最多只有一个真正的侦听器将附加到DOM。所以我们最多只能有2个 while (File >> c) { Dealers.push_back(new CDealer(c)); } 个听众,其中一个是被动的,另一个不是。

我的问题是,我无法检测收到的事件是否附有this.on('touchstart.passive', this.startHandler, { reject: errorHandler })选项。我认为我可以在本机事件对象上使用touchstart属性,因为在被动事件上调用{ passive: true }是错误的。但cancelable属性始终为true,即使浏览器会在preventDefault()上抛出错误。

我已阅读WhatWG DOM standard on event listeners并在Firefox和Chrome中进行了一些测试,但无法找到有关如何区分这两类事件的任何信息。

这对我的图书馆来说非常重要,因为被动事件监听器使用cancelable后置修复程序键入,例如preventDefault() vs ".passive"

如何检查收到的DOM事件是否为被动选项,以便我可以触发正确的内部侦听器?

修改

目前我附加听众流程的要点是:

"touchstart.passive"

其中"touchstart"是跟踪真实事件监听器的function eventNotifier(event) { this.fire(event.cancelable ? event.type : event.type + '.passive', new GestureEvent(event)) } addEvent(el, realEventName, eventNotifier, options) nativeListeners.set(eventName, 1) function addEvent (el, type, listener, options) { el.addEventListener(type, listener, options || true) }

2 个答案:

答案 0 :(得分:3)

您可以在调用event.defaultPrevented后测试event.preventDefault();的值。如果它是被动事件,浏览器将为该调用抛出警告/错误,但它不会停止执行javascript。所以以下内容应该有效:

document.addEventListener('touchstart', function(event) {
  event.preventDefault();
  
  if (event.defaultPrevented) {
    // This is not a passive event
  } else {
    // This is a passive event
  }
}, { passive: true });

我在这个链接中找到了这个答案的灵感:https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md

答案 1 :(得分:-2)

写一个if语句来检查监听器是否有" .passive"附接。