Задать вопрос
@ColdSpirit

Возможно ли отследить изменение Eventlistener у элемента? Или защитить EventListener от изменений?

Есть код расширения Firefox, который выполняется на странице сразу же, как она создается:
document.addEventListener("keydown", (e)=>console.log(e), false);

Проблема такая: страница очищает все листенеры на элементах через какое-то время. Не могу понять, как это поведение обойти, не используя таймеры.

Есть ли какой-то способ защитить листенер от удаления, может скрыть как-то?
Или, как альтернативный вариант - как отследить момент, когда листенер удаляется, чтобы через некоторое время встроить его заново?
  • Вопрос задан
  • 160 просмотров
Подписаться 3 Средний 3 комментария
Решения вопроса 1
@ColdSpirit Автор вопроса
В общем, как я понял, листенер удалялся так:
var oldRoot = document.documentElement;
var newRoot = oldRoot.cloneNode(true);
oldRoot.parentNode.replaceChild(newRoot, oldRoot);


При клонировании объекта, листенеры не клонирутся. Пришлось отслеживать событие элемента с помощью MutationObserver, и при удалении старого элемента с листенером навешивать листенер на новый элемент:
var oldEventListenerKeeper = document.documentElement;

var observer = new MutationObserver(function(mutations)
{
	mutations.forEach(function(mutation)
	{
		mutation.removedNodes.forEach(function(removedElement)
		{
			if (removedElement == oldEventListenerKeeper)
			{
				var newEventListenerKeeper = document.documentElement;
				newEventListenerKeeper.addEventListener("keydown", (e)=>console.log(e), false);
				oldEventListenerKeeper = newEventListenerKeeper;
			}
		});
	});
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы