JavaScript/jQuery:收听新注册的事件处理程序

问题描述:

我目前正在为我的大学开展一个项目。有一件事我需要做的是同步所有注册的JavaScript事件处理程序与服务器。即我需要知道哪些元素具有特定的事件处理程序。JavaScript/jQuery:收听新注册的事件处理程序

我已经使用VisualEvent来找出哪些元素具有事件处理程序,它的工作真的很棒。

但我需要的是有一个事件监听器,每次事件处理器被注册为一个DOM元素时被调用。

所以基本上每次调用类似$("#foo").click(...)$("#foo").bind(...)的东西时,我都需要获取这个元素的新事件处理程序已经注册的信息。

反之亦然从DOM元素中删除事件处理程序时,我需要一个侦听器,但对于第一个原型,这不是强制性的。

有没有办法可以将处理程序全局附加到所有事件处理程序注册?

如果您需要更多信息,请不要犹豫,以发表评论。

在此先感谢您的帮助!

最好的问候, 罗伯特

+1

为什么服务器需要知道? – zzzzBov 2012-02-07 14:11:14

+0

这是一个远程控制网站的研究项目的一部分。所以服务器需要知道哪些元素是可点击的。 – 2012-02-07 14:12:43

+0

我确定有更好的方法来解决这个问题,但是我对这个问题的了解不够多,不会给你任何好的建议。 – zzzzBov 2012-02-07 14:19:34

如果你正在使用jQuery 1.7+,所有的方法来连接事件经过jQuery.fn.on,所以它是压倒一切的是功能和去野生一个简单的例子;

(function() { 

    var old = jQuery.fn.on; 

    jQuery.fn.on = function (events, selector, data, handler) { 
     // Ensure you still attach the events 
     var result = old.apply(this, arguments); 

     // Now do your own thing 

     // Inside here, `this` refers to the jQuery object on which `on` was invoked; 
     // it's not a specific element like it normally is within jQuery. You then 
     // therefore use something like `this.each(function() { /* this */ }); to 
     // target each element in the set. 

     // You might want to normalize the variables, as selector and data are optional, 
     // and events can be an object or string 
     jQuery.post('/spy.php', { 
      events: events, 
      selector: selector, 
      data: data 
     }, jQuery.noop); 

     return result; // keep the signature of `on`, and return the value `on()` *would* have done. 
    }; 

}()); 

如果你正在使用jQuery < 1.7不能升级,你可以做一些类似上述的东西,但一定要覆盖bind()live()delegate()

+2

虽然您仍然需要一些方法来识别事件所附的元素。不知道如何才能工作,除非每个元素在标记中有一个唯一的ID。如果是这种情况,你可以在帖子中使用'elements:this.map(function(){return this.id;})。get()。join(“,”)'。 – 2012-02-07 14:25:54

+0

这完美的作品,非常感谢你马特和戴夫! :) – 2012-02-07 14:49:34