Javascript 捕获所有DOM事件

Javascript 捕获所有DOM事件,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我试图捕获页面上的所有DOM事件。这是我为此而设计的源代码。它需要jQuery。有没有更好的实施方案?看到我的实现有什么问题吗 //必需的jQuery $('*').each(function () { var ignore = [ 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave' ]; for (var key in this) { if (key.su

我试图捕获页面上的所有DOM事件。这是我为此而设计的源代码。它需要jQuery。有没有更好的实施方案?看到我的实现有什么问题吗

//必需的jQuery

$('*').each(function () {
    var ignore = [
        'mousemove', 'mouseover',  'mouseout',  'mouseenter', 'mouseleave'
    ];

    for (var key in this) {
        if (key.substring(0, 2) === 'on') {
            $(this).on(key.substr(2), function (event) {
                var eventName = event.type,
                    tag = this.tagName.toLowerCase(),
                    id = this.id ? ('#' + this.id) : '';

                if (ignore.indexOf(eventName) === -1) {
                    console.log(tag + id + ' ' + eventName);
                }
            });
        }
    }
});

也许使用内置的
\u data
帮助程序,类似这样的东西

$('*').each(function (i, el) {
  var events = $._data(el, 'events');
  if (events) {
    console.log(el);
    for (var p in events) {
      if (ignore.indexOf(p) === -1) { console.log(p); }
    }
  }
});

(尝试将其添加到此页面的控制台-您将看到元素及其事件滚动过去)。

可能类似以下内容:

function doSomething() { console.log('yay'); }

var eventName,
    prefix;

for (var key in document) {
    prefix = key.substr(0, 2);

    if (prefix === "on") {
        eventName = key.substr(2);        
        document.addEventListener(eventName, doSomething, true);
    }
}
它不需要jQuery,并在捕获模式下添加侦听器,这意味着如果停止传播,事件仍将被触发。当然,如果您愿意,您可以添加过滤


请注意,如果任何插件在您添加事件之前就添加了事件,那么在您访问它们之前,这些事件可能会被取消。如果您使用的是chrome,您可以在控制台中调用一种调试方法,该方法将记录特定元素上特定类型发生的所有事件。关于改进工作代码的问题应该在我们的姐妹网站上询问。Kevin B的“调试方法”是什么?
monitorents(element,event)
例如,
monitorents(document.body)
但是,还有一个更好的选择: