获取附加到元素的所有事件处理程序

Moh*_*ine 21 javascript jquery

我需要找到附加到#mySelect的所有事件处理程序,如果事件是通过jQuery创建的,我可以得到它,这里alert(e)只显示"change"而不是"click"

JavaScript:

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

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>
Run Code Online (Sandbox Code Playgroud)

Rob*_*obG 27

简短的回答是,使用javascript无法可靠地确定元素上的所有侦听器.

答案很长,没有标准机制来列出所有连接的侦听器.有些库保留了使用库附加的侦听器列表,但不一定了解其他侦听器.通过测试相关的元素属性和属性(对每个元素的onclick,onchange,onblur等进行一些繁琐的测试)可以找到标记中添加的或者作为元素属性的监听器.但是找不到使用addEventListenerattachEvent添加的侦听器是不可能的,除非在某处保留了引用并使其可用(请参阅有关库的注释).

此外,还存在"委托"侦听器,这些侦听器在将元素附加到父元素时提供附加到元素的外观.

  • 如果我能看到通过chrome检查器绑定的所有事件,那么应该有一些javascript方式做同样的事情吗?除非所有绑定的侦听器在chrome中都不可见.或者chrome有一些我们无法访问的未公开功能. (4认同)

小智 12

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

    },
    'click': function( event ) {

    }
});


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

  • 先生,你是救世主.我一直在寻找类似这样的东西,在Stack Overflow内外,到目前为止还没有人给出正确答案.然而,你的答案就是诀窍. (3认同)
  • 此代码仅适用于jQuery v1.*.*,但不适用于v2.*.* (3认同)
  • @GeorgeJempty这是JavaScript,没有真正的私有方法,因此使用下划线是开发人员告诉使用该库的人不要使用该方法的方式。私有方法不必关心公共消耗,因此会在不通知您的情况下发生变化......因此,不要使用它们! (2认同)