Вот моя проблема: можно ли как-то проверить наличие динамически прикрепленного прослушивателя событий? Или как я могу проверить статус свойства onclick (?) В DOM? Я искал в Интернете решение, как и Stack Overflow, но не повезло. Вот мой html:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Затем в Javascript я прикрепляю динамически созданный прослушиватель событий ко второй ссылке:
document.getElementById('link2').addEventListener('click', linkclick, false);
Код работает хорошо, но все мои попытки обнаружить этот прикрепленный слушатель терпят неудачу:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle здесь . Если вы нажмете «Добавить onclick for 2», а затем «[ссылка 2]», событие сработает нормально, но «Проверить ссылку 2» всегда выдает ошибку. Кто-нибудь может помочь?
Ответы:
Невозможно проверить, существуют ли динамически подключенные прослушиватели событий или нет.
Единственный способ узнать, подключен ли прослушиватель событий, - это подключить такие прослушиватели событий:
Затем вы можете проверить, был ли прикреплен прослушиватель событий
onclick
, возвратив!!elem.onclick
(или что-то подобное).источник
Я сделал что-то подобное:
Создание специального атрибута для элемента при присоединении слушателя с последующей проверкой его существования.
источник
Я бы создал логическое значение вне вашей функции, которое начинается как FALSE и устанавливается в TRUE, когда вы присоединяете событие. Это послужит вам своего рода флагом, прежде чем вы снова присоедините событие. Вот пример идеи.
источник
Возможный дубликат: проверьте, есть ли на элементе прослушиватель событий. Нет jQuery. Найдите здесь мой ответ.
В основном вот трюк для браузера Chromium (Chrome):
источник
tl; dr : Нет, вы не можете сделать это никаким изначально поддерживаемым способом.
Единственный известный мне способ добиться этого - создать пользовательский объект хранилища, в котором вы будете вести учет добавленных слушателей. Что-то вроде следующего:
Шаг 1. Во-первых, вам понадобится функция, которая может перемещаться по объекту хранилища и возвращать запись элемента, заданного элементом (или false).
Шаг 2: Затем вам понадобится функция, которая может добавить прослушиватель событий, но также вставить прослушиватель в объект хранилища.
Шаг 3: Что касается фактического требования вашего вопроса, вам понадобится следующая функция, чтобы проверить, был ли элемент добавлен в прослушиватель событий для указанного события.
Шаг 4: Наконец, вам понадобится функция, которая может удалить слушателя из объекта хранилища.
Фрагмент:
Показать фрагмент кода
Хотя прошло более 5 лет с тех пор, как OP опубликовал вопрос, я считаю, что люди, которые наткнутся на него в будущем, извлекут выгоду из этого ответа, поэтому не стесняйтесь вносить предложения или улучшения. 😊
источник
Вы всегда можете проверить вручную, существует ли ваш EventListener, например, с помощью инспектора Chrome. На вкладке «Элемент» есть традиционная вложенная вкладка «Стили» и рядом с ней еще одна: «Слушатели событий». Это даст вам список всех EventListeners с их связанными элементами.
источник
Кажется странным, что такого метода не существует. Не пора ли его наконец добавить?
Если бы вы хотели, вы могли бы что-то вроде следующего:
источник
Вот сценарий, который я использовал для проверки существования динамически прикрепленного прослушивателя событий. Я использовал jQuery, чтобы прикрепить обработчик событий к элементу, а затем инициировать это событие (в данном случае событие «щелчок»). Таким образом я могу извлекать и фиксировать свойства событий, которые будут существовать только в том случае, если обработчик событий прикреплен.
источник
Похоже, что нет кроссбраузерной функции, которая ищет события, зарегистрированные для данного элемента.
Однако можно просматривать функции обратного вызова для элементов в некоторых браузерах, используя их инструменты разработки. Это может быть полезно при попытке определить, как работает веб-страница, или для отладки кода.
Fire Fox
Сначала просмотрите элемент на вкладке « Инспектор » в инструментах разработчика. Это можно сделать:
Если для элемента были зарегистрированы какие-либо события, вы увидите кнопку, содержащую слово Событие рядом с элементом . Щелчок по нему позволит вам увидеть события, которые были зарегистрированы с элементом. Щелкнув стрелку рядом с событием, вы можете просмотреть для него функцию обратного вызова.
Хром
Сначала просмотрите элемент на вкладке « Элементы » в инструментах разработчика. Это можно сделать:
Рядом с разделом окна, в котором отображается дерево, содержащее элементы веб-страницы, должен быть другой раздел с вкладкой «Слушатели событий». Выберите его, чтобы увидеть события, зарегистрированные для элемента. Чтобы увидеть код для данного события, щелкните ссылку справа от него.
В Chrome события для элемента также можно найти с помощью функции getEventListeners . Однако, согласно моим тестам, функция getEventListeners не перечисляет события, когда ей передаются несколько элементов. Если вы хотите найти все элементы на странице, у которых есть слушатели, и просмотреть функции обратного вызова для этих слушателей, вы можете использовать следующий код в консоли для этого:
Отредактируйте этот ответ, если вы знаете, как это сделать в данных браузерах или в других браузерах.
источник
Я только что узнал об этом, пытаясь увидеть, прикреплено ли мое мероприятие ....
если вы это сделаете:
он вернет "нуль"
но если вы это сделаете:
тогда это "ИСТИНА"
поэтому я думаю, что когда вы используете addEventListener для добавления обработчиков событий, единственный способ получить к нему доступ - через hasOwnProperty. Хотел бы я знать, почему и как, но, увы, после исследования я не нашел объяснения.
источник
onclick
отдельно от.addEventListener
- это влияет на атрибут, а.addEventListener
не наЕсли я хорошо понимаю, вы можете только проверить, был ли проверен слушатель, но не то, какой именно слушатель является докладчиком.
Таким образом, некоторый специальный код восполнит пробел для обработки вашего потока кодирования. Практический метод - создать
state
переменные using. Например, прикрепите программу проверки слушателя следующим образом:тогда, если вы установите слушателя, просто измените значение:
затем внутри вашего callback-функции eventListener вы можете назначить определенные функции внутри и таким же образом распределить доступ к функциям в зависимости от некоторого состояния как переменной, например:
источник
Просто удалите событие перед его добавлением:
источник
Я только что написал сценарий, который позволяет вам этого добиться. Он предоставляет вам две глобальные функции:
hasEvent(Node elm, String event)
иgetEvents(Node elm)
которые вы можете использовать. Имейте в виду, что он изменяетEventTarget
метод прототипаadd/RemoveEventListener
и не работает для событий, добавленных с помощью разметки HTML или синтаксиса javascript дляelm.on_event = ...
Больше информации на GitHub
Живая демонстрация
Сценарий:
источник
Теоретически вы можете использовать addEventListener и removeEventListener для добавления флага удаления к объекту this. Ugly и я не тестировал ...
источник