Где хранятся обработчики событий Javascript?

Я пытаюсь выяснить, как DOM отслеживает обработчики событий, будь то связанные с помощью jQuery, addEventListener или атрибутом HTML (например, onload="myFunc()").

Я читал, что jQuery использует .data () способ хранения обработчиков событий, связанных jQuery... а как же остальные? Куда они направляются? Я знаю, что инструмент инспектора Webkit показывает прослушиватели событий, проверяя элемент на вкладке "элементы", но где он получает это информацию?

кстати, в некоторых тестах с использованием веб-инспектора Chrome я использовал консоль для замены версии jQuery на живом сайте на более новую, потянув <script> тег, таким образом переопределяя jQuery и $ переменные. Очевидно, что события, связанные с использованием jQuery до замены, были потеряны, потому что новый .в процессе был введен интерфейс data ().

те обработчики, которые "потеряны", однако, все еще связаны с определенными событиями, потому что они на самом деле в конечном итоге вызывается при возникновении события. Предположим, я хочу полностью удалить их или заменить своими собственными обработчиками? Вот почему я хотел бы знать, как получить доступ к фактическим обработчикам, где бы дом их ни держал... и без jQuery.

1 ответов


относительно таких методов, как addEventListener, они не видны непосредственно в обычном коде JavaScript. Они хранятся внутри.


что касается встроенных обработчиков, они просто хранятся непосредственно на элементе DOM, как типичный обработчик, так что это:

<a href="#" onclick='alert("foo");'>click</a>

эффективно становится этот:

a_element.onclick = function(event) { alert("foo"); };

(более старый IE не включает , вы фактически осиротели этих обработчиков. Вы не можете удалить обработчик, связанный с addEventListener Если у вас нет ссылки на этот обработчик. Поскольку универсальный обработчик jQuery также хранился в jQuery.cache, нет никакого способа развязать его, если вы не уничтожите сам элемент.

я не помню конкретно, имеет ли универсальный обработчик ссылку на jQuery.cache или только часть его. Ссылка это не повлияет на сколько дырявый данных может быть.