JavaScript/jQuery:收听新注册的事件处理程序
我目前正在为我的大学开展一个项目。有一件事我需要做的是同步所有注册的JavaScript事件处理程序与服务器。即我需要知道哪些元素具有特定的事件处理程序。JavaScript/jQuery:收听新注册的事件处理程序
我已经使用VisualEvent来找出哪些元素具有事件处理程序,它的工作真的很棒。
但我需要的是有一个事件监听器,每次事件处理器被注册为一个DOM元素时被调用。
所以基本上每次调用类似$("#foo").click(...)
或$("#foo").bind(...)
的东西时,我都需要获取这个元素的新事件处理程序已经注册的信息。
反之亦然从DOM元素中删除事件处理程序时,我需要一个侦听器,但对于第一个原型,这不是强制性的。
有没有办法可以将处理程序全局附加到所有事件处理程序注册?
如果您需要更多信息,请不要犹豫,以发表评论。
在此先感谢您的帮助!
最好的问候, 罗伯特
如果你正在使用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()
等
虽然您仍然需要一些方法来识别事件所附的元素。不知道如何才能工作,除非每个元素在标记中有一个唯一的ID。如果是这种情况,你可以在帖子中使用'elements:this.map(function(){return this.id;})。get()。join(“,”)'。 – 2012-02-07 14:25:54
这完美的作品,非常感谢你马特和戴夫! :) – 2012-02-07 14:49:34
为什么服务器需要知道? – zzzzBov 2012-02-07 14:11:14
这是一个远程控制网站的研究项目的一部分。所以服务器需要知道哪些元素是可点击的。 – 2012-02-07 14:12:43
我确定有更好的方法来解决这个问题,但是我对这个问题的了解不够多,不会给你任何好的建议。 – zzzzBov 2012-02-07 14:19:34