使用jQuery查找已注册在对象上的事件处理程序。

9 浏览
0 Comments

使用jQuery查找已注册在对象上的事件处理程序。

我需要找出注册在一个对象上的事件处理程序。\n例如:\n

$("#el").click(function() {...});
$("#el").mouseover(function() {...});

\n$(\"#el\")有click和mouseover事件注册。\n有没有一种方法可以找出这些事件,并可能迭代处理程序?\n如果在jQuery对象上没有合适的方法,那么在普通的DOM对象上是否有可能实现?

0
0 Comments

问题的出现原因是,对于jQuery 1.8+版本,之前使用的方法已经不再适用,因为内部数据被放置在一个不同的对象中。

解决方法是使用最新的非官方方法$._data(element, "events")。这里的下划线("_")是关键。在内部,它调用$.data(element, name, null, true),最后一个(第四个)参数是一个内部参数("pvt")。

之前的方法$._data("body", "events")会返回undefined,而正确的方法是$._data($("body").get(0), "events")或者更好的方法是$("body").data("events")

需要指出的是,文档中没有明确说明这个方法调用了另一个带有我们特意不公开的参数的数据函数。但是是的,jQuery._data( element, "events" )是获取这个信息的“正确”方法。

来源:api.jquery.com/jQuery.data

0
0 Comments

问题出现的原因是在jQuery 1.8+版本中,无法通过使用公共数据方法`jQuery("#el").data("events")`来查找对象上注册的事件处理程序。这是因为在较长时间内,`events`对象实际上没有存储在`.data()`中,通过从“公共API”中删除这个“代理”,我们从代码中删除了一些字节。

为了解决这个问题,我们可以使用“私有数据”方法`jQuery._data( jQuery("#el")[0], "events" )`来查找对象上注册的事件处理程序。下面是一个可以参考的示例代码:

$(function() {
  $("#el").click(function(){ alert("click"); });
  $("#el").mouseover(function(){ alert("mouseover"); });
  $.each($._data($("#el")[0], "events"), function(i, event) {
    output(i);
    $.each(event, function(j, h) {
        output("- " + h.handler);
    });
  });
});
function output(text) {
    $("#output").html(function(i, h) {
        return h + text + "";
    });
}

在这个示例中,我们通过`$._data($("#el")[0], "events")`来获取对象`#el`上的事件处理程序。然后,我们使用嵌套的`$.each`循环遍历每个事件类型和处理函数,并通过`output`函数将它们输出到页面上的`#output`元素中。

需要注意的是,这种方法仅适用于jQuery 1.8+版本,对于1.4版本无效。所以,在使用该方法时,请确保你的jQuery版本是1.8或更高。

0
0 Comments

问题的出现原因是,在jQuery 1.8版本中,事件数据不再在“公共API”中提供。解决方法是使用jQuery._data(elem, "events")来代替。elem应该是一个HTML元素,而不是一个jQuery对象或选择器。请注意,这是一个内部的“私有”结构,不应该被修改,只能用于调试目的。在旧版本的jQuery中,可能需要使用旧的方法,即jQuery(elem).data("events"),但仍然可以使用$._data($(elem).get(0), "events")。

在jQuery中,事件相关的数据存储在名为"events"的数据对象中。从1.8版本开始,这将被从用户数据命名空间中移除,以防止与相同名称的其他项目冲突。仍然可以通过jQuery._data(element, "events")访问jQuery的事件数据,但请注意,这是一个未记录的内部数据结构,不应该被修改。

有人使用这种方法来查找按钮的点击事件。在Chrome控制台中,点击属性中显示了handler: function () {。需要双击函数部分才能展开并显示函数的完整内容。

为了无缝支持两种选项,可以使用var events = (jQuery._data || jQuery.data)(elem, 'events');

还有一个快速而有用的函数,可以用来获取对象的所有事件:function events(e) { $(e).each(function(){console.log(this);console.log($._data( this, "events" ));console.log("\n")}) }

有人使用这个方法来编写testHandler函数,以测试特定处理程序是否附加到对象的事件上。

另外有人提出了一个问题,想要获取元素的所有事件,将它们保存在一个变量中,然后解除绑定元素,再重新绑定。但是,不应该引用以下划线开头的方法,这是一种不好的开发技巧。

最后,某些情况下这个方法返回了undefined。

0