在JQuery中,如果我这样做......
$('a').click(function(){
// Do something
});
...点击事件存储在$('a').data('events')
,我可以像这样获取它:
jQuery.each($('a').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
if(handler.type.toString() == 'click')
{
// do something
}
});
});
通过attachEvent
或addEventListener
附加的事件显然不会出现在$('a').data('events')
中。有什么我可以迭代它的位置?我猜他们在某个地方排队,但我找不到文件指出我正确的方向。
答案 0 :(得分:4)
来自quirksmode:
当前实施W3C事件注册的一个问题 model是你无法找出是否已经有任何事件处理程序 注册到元素。在传统模型中,你可以做到:
alert(element.onclick)
你会看到注册到它的函数,或者是否为undefined 没有注册。仅在最近的DOM Level 3 Events W3C中 添加一个eventListenerList来存储事件处理程序列表 目前在元素上注册。此功能尚未实现 任何浏览器都支持它,它太新了。但是,问题一直存在 寻址。
答案 1 :(得分:2)
如果您可以在页面开头安装代码,则可以使用此类挂钩在您自己的数据结构中记录所有后续侦听器:Why does Google +1 record my mouse movements?。
我知道无法访问现有的侦听器。
答案 2 :(得分:1)
// Introduced in DOM Level 2:
interface EventTarget {
void addEventListener(in DOMString type,
in EventListener listener,
in boolean useCapture);
void removeEventListener(in DOMString type,
in EventListener listener,
in boolean useCapture);
boolean dispatchEvent(in Event evt)
raises(EventException);
// Introduced in DOM Level 3:
readonly attribute EventListenerList eventListeners;
};
所以el.eventListeners
包含使用el
附加到el.addEventListener
的所有事件监听器。
您需要使用填充程序来处理浏览器支持。目前Chrome 12和Firefox 5不支持此