Как проверить, является ли событие слушателя пассивным событием? - PullRequest
0 голосов
/ 01 мая 2018

Я пишу библиотеку жестов / действий, которая также управляет слушателями событий и их срабатыванием. Я реализовал мою библиотеку для поддержки объектов жестов, устанавливающих пассивных слушателей через 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, который отслеживает реальных слушателей событий

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете проверить значение 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

0 голосов
/ 01 мая 2018

Напишите оператор if, чтобы проверить, подключен ли слушатель к «.passive».

...