我有一个页面,其中一些事件侦听器附加到输入框和选择框。有没有办法找出哪些事件侦听器正在观察特定的 DOM 节点以及针对什么事件?
事件附加使用:
- 原型的
Event.observe
; - DOM 的
addEventListener
; - 作为元素属性
element.onclick
。
我有一个页面,其中一些事件侦听器附加到输入框和选择框。有没有办法找出哪些事件侦听器正在观察特定的 DOM 节点以及针对什么事件?
事件附加使用:
Event.observe
;addEventListener
;element.onclick
。如果您只需要检查页面上发生的事情,您可以尝试Visual Event书签。
更新:Visual Event 2可用。
Chrome、Firefox、Vivaldi 和 SafarigetEventListeners(domElement)
在其开发人员工具控制台中支持。
对于大多数调试目的,可以使用它。
以下是使用它的非常好的参考:https : //developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
这取决于事件的附加方式。为了说明,假设我们有以下点击处理程序:
var handler = function() { alert('clicked!') };
我们将使用不同的方法将它附加到我们的元素上,有些允许检查,有些不允许。
方法 A) 单个事件处理程序
element.onclick = handler;
// inspect
console.log(element.onclick); // "function() { alert('clicked!') }"
方法 B) 多个事件处理程序
if(element.addEventListener) { // DOM standard
element.addEventListener('click', handler, false)
} else if(element.attachEvent) { // IE
element.attachEvent('onclick', handler)
}
// cannot inspect element to find handlers
方法 C):jQuery
$(element).click(handler);
1.3.x
// inspect
var clickEvents = $(element).data("events").click;
jQuery.each(clickEvents, function(key, value) {
console.log(value) // "function() { alert('clicked!') }"
})
1.4.x(将处理程序存储在一个对象中)
// inspect
var clickEvents = $(element).data("events").click;
jQuery.each(clickEvents, function(key, handlerObj) {
console.log(handlerObj.handler) // "function() { alert('clicked!') }"
// also available: handlerObj.type, handlerObj.namespace
})
1.7+(非常好)
使用此评论中的知识制作。
events = $._data(this, 'events');
for (type in events) {
events[type].forEach(function (event) {
console.log(event['handler']);
});
}
方法 D):原型(凌乱)
$(element).observe('click', handler);
1.5.x
// inspect
Event.observers.each(function(item) {
if(item[0] == element) {
console.log(item[2]) // "function() { alert('clicked!') }"
}
})
1.6 到 1.6.0.3,包括(这里非常困难)
// inspect. "_eventId" is for < 1.6.0.3 while
// "_prototypeEventID" was introduced in 1.6.0.3
var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click;
clickEvents.each(function(wrapper){
console.log(wrapper.handler) // "function() { alert('clicked!') }"
})
1.6.1(好一点)
// inspect
var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
clickEvents.each(function(wrapper){
console.log(wrapper.handler) // "function() { alert('clicked!') }"
})
单击控制台中的结果输出(显示函数的文本)时,控制台将直接导航到相关 JS 文件中函数声明的行。
Chrome 或 Safari 浏览器中的 WebKit Inspector 现在可以执行此操作。当您在 Elements 窗格中选择它时,它将显示 DOM 元素的事件侦听器。
可以在 JavaScript 中列出所有事件侦听器:这并不难;您只需要破解prototype
HTML 元素的's 方法(在添加侦听器之前)。
function reportIn(e){
var a = this.lastListenerInfo[this.lastListenerInfo.length-1];
console.log(a)
}
HTMLAnchorElement.prototype.realAddEventListener = HTMLAnchorElement.prototype.addEventListener;
HTMLAnchorElement.prototype.addEventListener = function(a,b,c){
this.realAddEventListener(a,reportIn,c);
this.realAddEventListener(a,b,c);
if(!this.lastListenerInfo){ this.lastListenerInfo = new Array()};
this.lastListenerInfo.push({a : a, b : b , c : c});
};
现在每个锚元素 ( a
) 都有一个lastListenerInfo
属性,其中包含它的所有侦听器。它甚至适用于使用匿名函数删除侦听器。