当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《jQuery查找使用对象注册的事件处理程序》经验,为你挑选了7个好方法。

我需要找到在对象上注册的事件处理程序.

例如:

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

$("#el")点击鼠标悬停注册.

是否有一个函数来找出它,并可能迭代事件处理程序?

如果通过适当的方法在jQuery对象上不可能,那么在纯DOM对象上是否可能?



1> jps..:

从jQuery 1.8开始,数据的"公共API"不再提供事件数据.阅读这篇jQuery博客文章.你现在应该使用它:

jQuery._data( elem, "events" );

elem 应该是HTML元素,而不是jQuery对象或选择器.

请注意,这是一个内部的"私有"结构,不应修改.仅用于调试目的.

在旧版本的jQuery中,您可能必须使用以下旧方法:

jQuery( elem ).data( "events" );


但你仍然可以使用`$ ._ data($(elem).get(0),"events")`
真?对我来说,这对我来说是1.10/2.0.
这不再有效.从1.9开始,这已被删除.
http://blog.jquery.com/2011/11/08/building-a-slimmer-jquery/ .data("events"):jQuery将其事件相关数据存储在名为(等待)事件的数据对象中在每个元素上.这是一个内部数据结构,因此在1.8中,这将从用户数据名称空间中删除,因此它不会与同名项目冲突.jQuery的事件数据仍然可以通过jQuery._data(元素,"事件")访问,但请注意,这是一个未记录的内部数据结构,不应修改.
jquery 1.8发布的新jsfiddle在这里http://jsfiddle.net/9n6gh/

2> Nick Craver..:

您可以通过抓取事件(从jQuery 1.8+开始)来实现,如下所示:

$.each($._data($("#id")[0], "events"), function(i, event) {
  // i is the event type, like "click"
  $.each(event, function(j, h) {
    // h.handler is the function being called
  });
});

这是一个你可以玩的例子:

$(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 + "
"; }); }

Test


3> PhistucK..:

对于jQuery 1.8+,这将不再有效,因为内部数据放在不同的对象中.

最新的非官方(但在以前的版本中也有效,至少在1.7.2中)现在这样做的方式是 - $._data(element, "events")

下划线("_")就是这里的不同之处.在内部,它正在调用$.data(element, name, null, true),最后一个(第四个)参数是内部参数("pvt").


@Michal - http://api.jquery.com/jQuery.data/说它接受一个元素,而不是一个选择器.
FWIW - 指出它"内部"使用参数调用其他数据函数,我们可能不需要文档.但是,是的,`jQuery._data(element,"events")`是现在获取此信息的'正确'方式.

4> Rui..:

无耻的插件,但你可以使用findHandlerJS

要使用它,您只需要包含findHandlersJS(或者只是将原始javascript代码复制并粘贴到chrome的控制台窗口),并为您感兴趣的元素指定事件类型和jquery选择器.

对于您的示例,您可以快速找到您提到的事件处理程序

findEventHandlers("click", "#el")
findEventHandlers("mouseover", "#el")

这是返回的内容:

element
注册事件处理程序的实际元素

events
包含有关我们感兴趣的事件类型的jquery事件处理程序的信息的数组(例如,单击,更改等)

处理
程序通过右键单击并选择显示函数定义可以看到的实际事件处理程序方法

selector
为委派事件提供的选择器.对于直接事件,它将是空的.

targets
包含此事件处理程序所针对的元素的列表.例如,对于在文档对象中注册并指向页面中所有按钮的委托事件处理程序,此属性将列出页面中的所有按钮.您可以将它们悬停在Chrome中以突出显示它们.

你可以在这里试试



5> Anton..:

为此,我使用eventbug插件来firebug.


此外,Chrome开发者工具在"元素"标签下有"事件监听器","源"标签下有"事件监听器断点".

6> algorhythm..:

我将@jps的两个解决方案合并到一个函数中:

jQuery.fn.getEvents = function() {
    if (typeof(jQuery._data) == 'function') {
        return jQuery._data(this.get(0), 'events') || {};
    } else if (typeof(this.data) == 'function') { // jQuery version < 1.7.?
        return this.data('events') || {};
    }
    return {};
};

但请注意,此函数只能返回使用jQuery本身设置的事件.



7> oligofren..:

从1.9开始,除了使用Migrate插件恢复旧行为之外,没有记录的方法来检索事件.你可以使用_.data()方法作为jps提及,但这是一个内部方法.因此,如果您需要此功能,只需做正确的事情并使用Migrate插件.

从jQuery文档开始 .data("events")

在1.9之前,如果没有其他代码定义了名为"events"的数据元素,则可以使用.data("events")来检索jQuery的未记录的内部事件数据结构.这个特例已在1.9中删除.没有公共接口来检索此内部数据结构,并且它仍未记录.但是,jQuery Migrate插件会针对依赖于它的代码恢复此行为.


您似乎误解了Migrate插件的重点.jQuery删除了已弃用的功能,而Migrate插件旨在帮助**将**开发人员的代码迁移到更新的版本,以便他们可以立即利用新功能和改进,但不会丢失功能.这是为了帮助编码人员看到他们需要做什么才能正确使用新版本的jQuery.你不应该在生产中使用它来恢复**功能.此外,许多事情都没有记录在jQuery文档中并且是最新的 - 他们之前已经指出过,所以这不是理由
私有的,未记录的方式永远不会是“正确的”方式。正确的方法(即已记录的,公开的和预期的)是使用Migrate插件。
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有