【问题标题】:List all javascript events wired up on a page using jquery列出使用 jquery 在页面上连接的所有 javascript 事件
【发布时间】:2009-04-13 13:22:51
【问题描述】:

使用 jQuery,是否可以获得所有事件的列表以及事件绑定到哪个元素?

【问题讨论】:

标签: javascript jquery events


【解决方案1】:

jQuery 使这相对容易,因为它将事件处理程序存储在元素数据中。你应该可以使用这样的东西:

(function($) {
    $.eventReport = function(selector, root) {
        var s = [];
        $(selector || '*', root).andSelf().each(function() {
            // the following line is the only change
            var e = $.data(this, 'events');
            if(!e) return;
            s.push(this.tagName);
            if(this.id) s.push('#', this.id);
            if(this.className) s.push('.', this.className.replace(/ +/g, '.'));
            for(var p in e) {
                var r = e[p],
                    h = r.length - r.delegateCount;
                if(h)
                    s.push('\n', h, ' ', p, ' handler', h > 1 ? 's' : '');
                if(r.delegateCount) {
                    for(var q = 0; q < r.length; q++)
                        if(r[q].selector) s.push('\n', p, ' for ', r[q].selector);
                }
            }
            s.push('\n\n');
        });
        return s.join('');
    }
    $.fn.eventReport = function(selector) {
        return $.eventReport(selector, this);
    }
})(jQuery);

你可以这样称呼它:

// all events
alert($.eventReport());

// just events on inputs
alert($.eventReport('input')); 

// just events assigned to this element
alert($.eventReport('#myelement')); 

// events assigned to inputs in this element
alert($.eventReport('input', '#myelement')); 
alert($('#myelement').eventReport('input')); // same result

// just events assigned to this element's children
alert($('#myelement').eventReport()); 
alert($.eventReport('*', '#myelement'); // same result

更新: 我在上述函数的输出中添加了一些处理程序和一些有关委托事件的信息。

更新(2012 年 8 月 24 日): 虽然上面的函数在 jQuery 1.7.2 及更低版本中仍然有效,但 jQuery 不再将事件对象存储在jQuery.data(elem, 'events')如果您使用的是 jQuery 1.8 或更高版本,您将无法再使用上面的函数!

作为jQuery.data(elem, 'events') 的交换,您现在可以使用jQuery._data(elem, 'events')。对上述函数的更新如下所示:

(function($) {
    $.eventReport = function(selector, root) {
        var s = [];
        $(selector || '*', root).addBack().each(function() {
            // the following line is the only change
            var e = $._data(this, 'events');
            if(!e) return;
            s.push(this.tagName);
            if(this.id) s.push('#', this.id);
            if(this.className) s.push('.', this.className.replace(/ +/g, '.'));
            for(var p in e) {
                var r = e[p],
                    h = r.length - r.delegateCount;
                if(h)
                    s.push('\n', h, ' ', p, ' handler', h > 1 ? 's' : '');
                if(r.delegateCount) {
                    for(var q = 0; q < r.length; q++)
                        if(r[q].selector) s.push('\n', p, ' for ', r[q].selector);
                }
            }
            s.push('\n\n');
        });
        return s.join('');
    }
    $.fn.eventReport = function(selector) {
        return $.eventReport(selector, this);
    }
})(jQuery);

更新(2013 年 4 月 25 日): andSelf() 已从 1.8.x http://bugs.jquery.com/ticket/9800 弃用,我改为使用 addBack() 替换。

【讨论】:

  • 更新了 jQuery 1.8 修复和一些额外的输出处理程序计数和委托事件。
  • 答案不包括文档或窗口上的事件,仅供参考,尽管您可以让他们执行 $.eventReport(document) 和 $.eventReport(window)
  • 我似乎每隔几年就会回来一次,而且它仍然有效。拥有如此出色的工具。
  • 这是我收集的超酷和有用的脚本。
  • @alexandernst,它不是一个数组,而是一个对象。你可以修改它,虽然我会小心地这样做......它是 jQuery 内部的一部分,用于管理事件。
【解决方案2】:
// List bound events
console.log($('#elem').data('events'));

// Log ALL handlers for ALL events
$.each($('#elem').data('events'), function(i, event) {
  $.each(event, function(i, handler){
    console.log(handler.toString());
  });
});

【讨论】:

    【解决方案3】:

    我用这个来列出所有有界事件的元素。

    $('*').each(function(){
        var events = $(this).data('events');
        if(events != null)
        {
            console.log(this);
            console.log(events);
        }
    });
    

    还可以通过编写一些额外的代码来收集元素作为每个事件的列表:

    var eventArrays = {};
    
    $('*').each(function(){
        var events = $(this).data('events');
        for(var anEvent in events){
            if(!eventArrays[anEvent])
                eventArrays[anEvent] = [];
            eventArrays[anEvent].push(this);
        }
    });
    
    console.log(eventArrays);
    

    【讨论】:

      【解决方案4】:

      我敢打赌,您可以遍历 DOM 并检查每个元素上的事件 attribute 构建一个列表...但我从未尝试过。

      【讨论】:

        【解决方案5】:

        为了使用 console.table() 我做了一些修改...

        (function($) {
            $.eventReport = function(selector, root) {
                var s = [];
                $(selector || '*', root).addBack().each(function() {
                    var e = $._data(this, 'events');
                    if(!e) return;
                    var tagGroup = this.tagName || "document";
                    if(this.id) tagGroup += '#' + this.id;
                    if(this.className) tagGroup += '.' + this.className.replace(/ +/g, '.');
        
                    var delegates = [];
                    for(var p in e) {
                        var r = e[p];
                        var h = r.length - r.delegateCount;
        
                        if(h)
                            s.push([tagGroup, p + ' handler' + (h > 1 ? 's' : '')]);
        
                        if(r.delegateCount) {
                            for(var q = 0; q < r.length; q++)
                                if(r[q].selector) s.push([tagGroup + ' delegates', p + ' for ' + r[q].selector]);
                        }
                    }
                });
                return s;
            }
            $.fn.eventReport = function(selector) {
                return $.eventReport(selector, this);
            }
        })(jQuery);
        

        所以现在我可以这样做了:

        console.table($.eventReport())
        

        看看 chrome 会发生什么:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 2011-11-19
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 2012-10-08
          相关资源
          最近更新 更多