Мне нужно найти, какие обработчики событий зарегистрированы для объекта.
Например:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
зарегистрирован клик и наведение мыши .
Есть ли функция, чтобы узнать это и, возможно, перебрать обработчики событий?
Если это невозможно для объекта jQuery через надлежащие методы, возможно ли это для простого объекта DOM?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Ответы:
Начиная с jQuery 1.8, данные событий больше не доступны из «публичного API» для данных. Прочитайте этот пост в блоге jQuery . Теперь вы должны использовать это вместо:
elem
должен быть элементом HTML, а не объектом jQuery или селектором.Обратите внимание, что это внутренняя «частная» структура, которая не должна изменяться. Используйте это только для целей отладки.
В старых версиях jQuery вам, возможно, придется использовать старый метод:
источник
$._data($(elem).get(0), "events")
handler: function () {
внутри свойства click. Мне пришлось дважды щелкнуть мышью на функциональной части, чтобы развернуть и показать все содержимое функции.var events = (jQuery._data || jQuery.data)(elem, 'events');
Вы можете сделать это путем сканирования событий (начиная с jQuery 1.8+), например:
Вот пример, с которым вы можете играть:
источник
jQuery._data( jQuery("#el")[0], "events" );
вместо метода «публичных данных»:jQuery("#el").data("events")
.events
самом деле объект долго не хранился.data()
, мы удалили несколько байтов кода, удалив этот «прокси» из «публичного API»В jQuery 1.8+ это больше не будет работать, поскольку внутренние данные помещены в другой объект.
Последний неофициальный (но работает и в предыдущих версиях, по крайней мере, в 1.7.2) способ сделать это сейчас -
$._data(element, "events")
Подчеркивание («_») - вот что здесь имеет значение. Внутренне он вызывает
$.data(element, name, null, true)
, последний (четвертый) параметр является внутренним ("pvt").источник
jQuery._data( element, "events" )
это «правильный» способ получить эту информацию сейчас.Бесстыдная вилка, но вы можете использовать findHandlerJS
Чтобы использовать его, вы просто должны включить findHandlersJS (или просто скопировать и вставить сырой код JavaScript в окно консоли chrome) и указать тип события и селектор jquery для интересующих вас элементов.
Для вашего примера вы можете быстро найти обработчики событий, которые вы упомянули, выполнив
Вот что возвращается:
Фактический элемент, в котором обработчик события был зарегистрирован в
Массив с информацией об обработчиках событий jquery для интересующего нас типа события (например, щелчок, изменение и т. д.).
Фактический метод обработчика событий, который вы можете увидеть, щелкнув его правой кнопкой мыши и выбрав Показать определение функции
Селектор, предназначенный для делегированных событий. Для прямых событий будет пусто.
список целей с элементами, на которые нацелен этот обработчик событий. Например, для делегированного обработчика событий, который зарегистрирован в объекте документа и предназначается для всех кнопок на странице, это свойство будет перечислять все кнопки на странице. Вы можете навести их и увидеть, что они выделены хромом.
Вы можете попробовать это здесь
источник
Я использую eventbug плагин Firebug для этой цели.
источник
Я объединил оба решения из @jps в одну функцию:
Но будьте осторожны, эта функция может возвращать только те события, которые были установлены с помощью самого jQuery.
источник
Начиная с версии 1.9, нет документированного способа получения событий, кроме использования плагина Migrate для восстановления старого поведения. Вы можете использовать метод _.data (), как упоминает jps, но это внутренний метод. Так что просто сделайте правильно и используйте плагин Migrate, если вам нужна эта функциональность.
Из документации по jQuery
.data("events")
источник
jQuery._data( elem, "events" );
...Чтобы проверить события на элементе:
Например:
или
Полный пример:
Более полный способ проверки, включающий динамические слушатели, установленные с помощью $ (document) .on
Пример использования:
источник
getEvents
метод в целом великолепен, но дело в том, что он дает повторяющиеся записи в IE11 (я знаю, IE снова, но корпоративная необходимость в этом ...). РЕДАКТИРОВАТЬ: $ ._ данные содержат дубликаты событий для элемента, хотя в FF он не содержит ... странный мир IE. Но важно остерегаться возможности повторения событий.Я создал пользовательский селектор jQuery, который проверяет как кеш jQuery назначенных обработчиков событий, так и элементы, которые используют собственный метод для их добавления:
Пример:
Это вернет элементы, к которым прикреплен обработчик кликов.
источник
В современном браузере с ECMAScript 5.1 /
Array.prototype.map
вы также можете использоватьв консоли браузера, которая будет печатать исходные коды обработчиков, разделенных запятой. Полезно, чтобы взглянуть на то, что все работает на определенном событии.
источник
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Uncaught TypeError: Невозможно прочитать свойство 'EVENT_NAME' из undefined в <anonymous>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
это строка, а не элемент DOM.События могут быть получены с помощью:
или jQuery 1.8+:
Примечание: события, ограниченные использованием,
$('selector').live('event', handler)
могут быть получены с помощью:источник
Я должен сказать, что многие ответы интересны, но недавно у меня возникла похожая проблема, и решение было очень простым, если идти по DOM. Это отличается тем, что вы не повторяете, а целитесь непосредственно в нужное вам событие, но ниже я дам более общий ответ.
У меня было изображение в ряд:
И к этому изображению был прикреплен обработчик события click:
Мое намерение состояло в том, чтобы расширить область нажатия на всю строку, поэтому я сначала получил все изображения и относительные строки:
Теперь в фактической строке ответа я просто сделал следующее, дав ответ на оригинальный вопрос:
Поэтому я извлек обработчик событий непосредственно из элемента DOM и поместил его в обработчик событий нажатия jQuery. Работает как шарм.
Теперь к общему случаю. В прежние дни до jQuery вы могли привязать все события к объекту с помощью двух простых, но мощных функций, подаренных нам, смертным, Дугласом Крокфордом :
источник
Попробуйте подключаемый модуль отладчика jquery, если вы используете Chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=en
источник
Другой способ сделать это - просто использовать jQuery для захвата элемента, а затем пройти через настоящий Javascript, чтобы получить, установить и поиграть с обработчиками событий. Например:
источник
Я объединил некоторые из ответов выше и создал этот безумно выглядящий, но функциональный скрипт, который, как мы надеемся, перечисляет большинство слушателей событий для данного элемента. Не стесняйтесь оптимизировать это здесь.
источник
jQuery не позволяет вам просто получить доступ к событиям для данного элемента. Вы можете получить к ним доступ, используя недокументированный внутренний метод
Но он все равно не даст вам все события, а точнее не покажет вам события, назначенные с
Эти события хранятся внутри документа, поэтому вы можете получить их, просматривая
но это тяжелая работа, поскольку есть события для всей веб-страницы.
Том Г создал созданную функцию, которая фильтрует документ только по событиям данного элемента и объединяет выходные данные обоих методов, но у него есть недостаток дублирования событий в выходных данных (и, по сути, из-за того, что внутренний список событий jQuery связывается с вашим приложением). Я исправил этот недостаток, и вы можете найти код ниже. Просто вставьте его в консоль разработчика или в код приложения и выполните его, когда необходимо, чтобы получить хороший список всех событий для данного элемента.
Что важно отметить, элемент на самом деле является HTMLElement, а не объектом jQuery.
источник