列出元素的所有绑定事件(使用jQuery)

40
有没有一种方法可以列出jQuery元素上的所有绑定? jQuery的bind()似乎只能附加它们,并且我没有找到一个获取绑定的jQuery函数。
6个回答

30

本答案适用于jQuery版本 < 1.8

最好的方法可能是使用FireFox的FireQuery插件。真的是一个很不错的工具。

如果你想要/需要在代码中实现,可以使用jQuery的.data('events')对象。

$.each($('#element').data('events'), function(i, e) {
    console.log(i, e);
});

所有通过jQuery绑定的事件都会被推入该对象中。当然,可能还有其他的事件处理程序,比如on-anything,你需要显式地进行检查。

参考资料: FireQuery


是的,我需要在代码中实现它(用于编写一些测试)。你的解决方案非常好。非常感谢。 - medihack
4
如果您使用的是 jQuery 1.8 或更高版本,请参阅我下面的答案。 - Grinn
6
这里的所有答案都不适用于我。但是这个网址上被接受的答案很好用。使用jQuery._data( elem, "events" );,其中elem是HTML元素(而非jQuery对象)。 - Richard Rout
或者使用 $("#elem").get(0),它会返回 HTML 元素。 - fdelia

19

从jQuery 1.8开始,新的语法如下:

$.each($._data("#element", "events"), function(i, e) {
console.log(i, e);
});

注意,它是$._data("#element" 而不是 $.data($("#element"),所以如果需要使用$myJQuerySelector[0]来取消选择器的包装。

了解更多...


13

一定有一种编程的方法可以做到这一点,而且有人已经想出了办法并将其放入视觉工具中。

我不确定这是否回答了你的问题,但我已经找到了最好的确定这些绑定的工具,它叫做Visual Event(不是很好的名字,实际上很难在谷歌上搜索)。

这适用于Firefox、Chrome、Chromium、Safari等浏览器。某些绑定问题可能在不同的浏览器中会有所不同。最好涵盖所有情况。

如果您有一个遮罩并且需要获取元素下面的内容,则可以双击任何绑定以将其隐藏,以便查看所需的事件。

alt text


5

根据其他答案和评论。

JQuery 1.8及以上版本

var elementSelector = '#element-id';

$(elementSelector).bind('click.test', function(){}); // For testing.

$.each($._data($(elementSelector)[0], 'events'), function(i, e) {
    console.log(i, e);
});
$._data()的第一个参数不是jquery对象。

请注意,这不是支持的公共接口;实际数据结构可能从版本到版本不兼容地发生更改。- Jquery 1.8发布


JQuery 1.8以下

var elementSelector = '#elementid';

$(elementSelector).bind('click.test', function(){}); // For testing.

$.each($(elementSelector).data('events'), function(i, e) {
    console.log(i, e);
});

在 jQuery 1.6 版本中,为了防止名称冲突,jQuery 将其内部数据与用户数据分开。然而,一些人使用了未经记录的“事件”数据结构,因此我们通过 .data() 仍然可以检索该数据。但是,在 1.8 版本中,这已经被移除了。- Jquery 1.8 发布

如果使用的是 JQuery 1.8 及以上版本,那就是正确答案!谢谢!+1 - Guilherme Nascimento

3
以下代码查看一个元素及其所有子元素,并在控制台记录任何绑定的事件。
function findMyEvents(me) {

    if (typeof $._data($(me)[0], 'events') !== "undefined") {
        console.log($(me)[0])
        console.log($._data($(me)[0], 'events'))
        $._data($(me)[0], 'events')
    };
    for (var i = 0; i < $(me).children().length; i++) {
        findMyEvents($(me).children()[i])
    }
}

findMyEvents('body')

0

我无法让Grinn的答案起作用。从jQuery 1.8 find event handlers中,我认为示例应该更改为

var obj = $('#element');
$.each($._data(obj[0], "events"), function(i, e) {
console.log(i, e);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接