Чи можу я знайти події, пов'язані на елементі з jQuery?


355

Я пов'язую два обробники подій за цим посиланням:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

Чи є спосіб отримати список усіх подій, пов'язаних на елементі, в даному випадку на елементі з id="elm"?

Відповіді:


517

У сучасних версіях jQuery ви використовуєте $._dataметод для пошуку будь-яких подій, приєднаних jQuery до відповідного елемента. Зауважте , це лише метод внутрішнього використання:

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

Результатом $._dataбуде об'єкт, який містить обидва події, які ми встановили (на фото нижче із mouseoutрозширеним властивістю):

Вихід консолі за $ ._

Потім у Chrome ви можете клацнути правою кнопкою миші функцію обробника та натиснути "Перегляд визначення функції", щоб показати точне місце, де це визначено у вашому коді.


59
Це працює лише для елементів, пов'язаних через помічники jQuery.
Олексій Кімініан

3
@jammypeach Я намагаюся вирішити ваше рішення, але все одно отримую невизначене повернення для селектора. Я використав $ ('# elem'). Bind ('click', function () {}); якщо це мало б значення.
Маркус

6
@marcus ahhh, woops Я щось пропустив, вибач :)$._data(element[0], ‘events’);
totalNotLizards

16
У ці дні потрібно використовувати: $ ._ даних ($ ( '# Foo') [0]) .events
Дональд Тейлор

5
$._data()використовується JQuery Internal. $.data()є загальнодоступним методом для користувача. І $.data(element, 'events')працює чудово.
слайд-

73

Загальний випадок:

  • Натисніть, F12щоб відкрити Dev Tools
  • Перейдіть на Sourcesвкладку
  • Праворуч прокрутіть вниз до Event Listener Breakpointsі розгорніть дерево
  • Клацніть на події, які ви хочете слухати.
  • Взаємодійте з цільовим елементом, якщо вони стрілять, ви отримаєте точку злому в налагоджувачі

Аналогічно можна:

  • клацніть правою кнопкою миші на цільовому елементі -> виберіть " Inspect element"
  • Прокрутіть вниз праворуч рамку розробника, внизу - ' event listeners'.
  • Розгорніть дерево, щоб побачити, які події додаються до елемента. Не впевнений, чи це працює для подій, які обробляються через бульбашку

3
Я погоджуюсь, що це кращий метод і є універсальним рішенням, а не покладатися на jQuery, який може бути або не доступний.
deadbabykitten

3
@dead umm ... питання спеціально стосується jQuery і використовує jQuery у прикладі вкладення - відповідь має бути дійсною лише в контексті jQuery (?)
Code Jockey

3
Корисно зрозуміти відповіді і в інших контекстах. Тільки тому, що хтось задає конкретне запитання, не означає, що обмежена відповідь, яку вони отримають, є найкращою з доступних. Особливо з jQuery люди схильні покладатися на це як на милицю. Розуміння основної архітектури є важливим. Ця відповідь показує, що jQuery навіть не обов'язково потрібен. Питання та приклад занадто розпливчасті, щоб знати його використання, і тому залишають відкритими для тлумачення того, що можна вважати правильною відповіддю.
deadbabykitten

12

Я додаю це для нащадків; Існує простіший спосіб, який не передбачає написання більше JS. Використовуючи дивовижний додаток firebug для firefox ,

  1. Клацніть правою кнопкою миші на елементі та виберіть "Оглянути елемент за допомогою Firebug"
  2. На панелях бічної панелі (показано на скріншоті) перейдіть до вкладки подій за допомогою крихітної стрілки>
  3. На вкладці події відображаються події та відповідні функції для кожної події
  4. Текст поруч із ним показує розташування функції

введіть тут опис зображення


1
Це також доступно в інструментах розробки IE.
девлін карнат

9

Тепер ви можете просто отримати список слухачів подій, пов'язаних з об'єктом, за допомогою функції javascript getEventListeners ().

Наприклад, введіть наступне на консолі інструментів розробки:

// Get all event listners bound to the document object
getEventListeners(document);

4
Я думаю, що це не є власною функцією і потребує наступного сценарію / залежності: github.com/colxi/getEventListeners Це слід додати до відповіді, оскільки це вводить в оману в іншому випадку. Але дякую за те, що ви довели до цього "плагіна"; виглядає добре. :)
Dennis98

6

JQuery Audit плагін плагін повинен дозволити вам зробити це з допомогою звичайних інструментів Chrome Dev. Це не ідеально, але він повинен дозволяти вам бачити фактичний обробник, прив'язаний до елемента / події, а не лише загальний обробник jQuery.


3

Хоча це не зовсім конкретно для селекторів / об’єктів jQuery, у FireFox Quantum 58.x ви можете знайти обробників подій на елементі за допомогою інструментів Dev:

  1. Клацніть елемент правою кнопкою миші
  2. У контекстному меню натисніть "Перевірити елемент"
  3. Якщо поруч із елементом (жовте поле) є значок 'ev', натисніть на значок 'ev'
  4. Відображає всі події для цього елемента та обробника подій

Інструменти для квантових розробок FF


1
дивовижна відповідь, особливо скріншот робить це набагато простіше. Дякую за старання!
bizi

2

Я використовував щось подібне, якщо (. якщо мій елемент пов'язаний з якоюсь подією. Він все одно буде визначатись невизначеним (null), якщо ви додали до цього елемента всі обробники подій. Ось чому я оцінюю це в виразі if.


2

Зауважте, що події можуть бути додані до самого документа, а не до елемента, про який йде мова. У такому випадку вам потрібно використовувати:

$._data( $(document)[0], "events" );

І знайдіть подію за допомогою правильного селектора :

введіть тут опис зображення

А потім подивіться на обробник > [[FunctionLocation]]

введіть тут опис зображення


0

Коли я передаю невеликий складний запит DOM до $ ._ таких даних: $._data($('#outerWrap .innerWrap ul li:last a'), 'events')він кидає невизначені в консолі браузера.

Тому мені довелося використовувати дані $ ._ на батьківському діві: $._data($('#outerWrap')[0], 'events')щоб побачити події для тегів. Ось JSFiddle для того ж: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/


3
Причиною цього є те, що ви делегуєте подію $('#outerWrap'). Події насправді пов'язані саме з цим елементом, а не з окремими якорями.
Скоттукс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.