Слушатели не будут добавлены синхронно, поэтому пользовательский скрипт, который выполняется синхронно, не удалит слушателей.
Альтернативой может быть добавление слушателя к window
, в фаза захвата и вызов stopPropagation
для события:
['keydown', 'keyup'].forEach((eventName) => {
window.addEventListener(
eventName,
(e) => {
e.stopPropagation();
},
true // capturing phase - very important
);
});
Это предотвратит запуск прослушивателей, добавленных к дочерним узлам.Чтобы также предотвратить добавление слушателей в window
после , когда этот слушатель был добавлен из-за запуска, вы можете вызвать e.stopImmediatePropagation()
.
Единственный случай, когда такой метод не будет работать, будетесли страница добавляет собственного слушателя к window
до вашего пользовательского сценария.
Чтобы убедиться, что ваш скрипт выполняется максимально быстро (вы хотите, чтобы ваш собственный слушатель был подключен как можно скорее),вы можете поместить
// @run-at document-start
в блок метаданных, что может помочь, но, к сожалению, не совсем надежно.