Я пишу библиотеку жестов / действий, которая также управляет слушателями событий и их срабатыванием. Я реализовал мою библиотеку для поддержки объектов жестов, устанавливающих пассивных слушателей через API, который выглядит следующим образом: this.on('touchstart.passive', this.startHandler, { reject: errorHandler })
. Моя библиотека поддерживает несколько жестов, устанавливая несколько слушателей, как пассивных, так и непассивных. Библиотека гарантирует, что к DOM будет подключен не более одного реального слушателя. Таким образом, у нас может быть максимум 2 touchstart
слушателя, где один пассивен, а другой нет.
Мой вопрос и проблема в том, что я не могу определить, было ли полученное событие присоединено с опцией { passive: true }
. Я подумал, что мог бы использовать свойство cancelable
для собственного объекта события, поскольку было бы ошибкой вызывать preventDefault()
для пассивного события. Но свойство cancelable
всегда имеет значение true, даже если браузер выдаст ошибку на preventDefault()
.
Я прочитал стандарт WhatWG DOM для прослушивателей событий и провел несколько тестов в Firefox и Chrome, но не могу найти никакой информации о том, как различать два типа событий.
Это важно для моей библиотеки, так как пассивный слушатель события имеет ключ ".passive"
post-fix, например "touchstart.passive"
против "touchstart"
.
Как проверить полученное событие DOM на наличие пассивной опции, чтобы я мог вызвать нужных внутренних слушателей?
EDIT
В настоящее время суть моего потока для присоединения слушателей:
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)
}
, где nativeListeners
- это Map
, который отслеживает реальных слушателей событий