Получить все обработчики событий, привязанные к элементу

Мне нужно найти все обработчики событий, прикрепленные к #mySelect, и если событие создано через jQuery, я могу его получить, здесь alert (e) покажет только "изменение" без "click"

JavaScript:

$("#mySelect").change(function(){
    alert("changed");
})           
$.each($._data(  $("#mySelect")[0], "events" ), function(e) {
    alert(e);
})

Html:

<select id="mySelect" onclick="alert('hello')" >
    <option value="1">option 1</option>
    <option value="2">option 2</option>
    <option value="3">option 3</option>
    <option value="4">option 4</option>
</select>

Ответ 1

Короткий ответ заключается в том, что невозможно достоверно определить всех слушателей на элементе, просто используя javascript.

Долгий ответ заключается в том, что нет стандартного механизма для перечисления всех подключенных слушателей. Некоторые библиотеки хранят список слушателей, которые были прикреплены с помощью библиотеки, но не обязательно знают о других слушателях. Слушатели, добавленные в разметку или как свойства элемента, можно найти, тестируя связанные свойства и атрибуты элемента (несколько утомительное тестирование для onclick, onchange, onblur и т.д. Для каждого элемента). Но невозможно найти слушателя, добавленного с помощью addEventListener или attachEvent, если ссылка не была где-то сохранена и она была доступна (см. Комментарий о библиотеках).

Кроме того, есть "делегированные" слушатели, которые придают вид привязки к элементу, когда на самом деле они привязаны к родительскому элементу.

Ответ 2

$( '#mySelect' ).bind( {
    'change': function( event ) {

    },
    'click': function( event ) {

    }
});


$.each($._data(  $("#mySelect")[0], "events" ), function(e) {
    alert(e);
});

Ответ 3

В дополнение к событиям, прилагаемым в строке, вы можете попробовать следующее:

alert(document.getElementById('mySelect').getAttribute('onclick'));