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

dot*_*ter 6 javascript w3c dom dom-events

我正在编写一个手势/动作库,它也管理事件监听器和触发.我已经实现了我的lib支持手势对象通过,看起来像这样的API将被动的听众:this.on('touchstart.passive', this.startHandler, { reject: errorHandler }).我的lib支持多种手势,设置多个被动,无论是被动还是非被动.lib将确保最多只有一个真正的侦听器将附加到DOM.所以我们最多只能有2个touchstart听众,其中一个是被动的,另一个不是.

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

我已经在事件监听器上阅读了WhatWG DOM标准,并在Firefox和Chrome中进行了一些测试,但无法找到有关如何区分这两类事件的任何信息.

这是我的图书馆显著,因为被动的事件监听器与键".passive"后修复,例如"touchstart.passive"VS "touchstart".

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

编辑

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

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)
}
Run Code Online (Sandbox Code Playgroud)

这里nativeListeners是一个Map是守实事件侦听器的轨道

emi*_*sen 6

您可以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 });
Run Code Online (Sandbox Code Playgroud)

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

  • 不,你的答案是在正确的方向。但我选择了不同的方法,因为它更容易实现。我只有 2 个“eventNotifier”。一种用于被动活动,一种用于常规活动。我为被动事件附加了被动的“eventNotifierPassive”,因此我不需要测试本机事件。但如果下面这行能起作用,那就有意义了: `addEventListener('wheel', e => { if (e.cancelable) e.preventDefault() }, { Passive:true })` 遗憾的是,Chrome 将有 `cancelable ` 如果有另一个非被动侦听器侦听相同的事件名称/类型,则为 true。 (2认同)