技术上有什么办法获得指定 HTMLElement 上有绑定那些 #JavaScript 函数事件,及其处理函数么?
比如我有一个按钮,想知道他绑定了那些事件? click 事件的处理函数是什么?
elem.onclick
这种只能绑定唯一的一个事件处理函数,可以直接取到。
DOM Level 3 有 [http://www.w3.org/TR/2001/WD-DOM-Level-3-Events-20010823/events.html#Events-EventListenerList eventListenerList] 接口,但是现在还没有浏览器实现。
不过可以通过框架包装的方式获取列表。 另外 Google Chrome 浏览器的开发者工具有提供查看元素绑定了哪些事件的特性, 猜测是通过解析页面及其引入的 JavaScript 源码得到的 (据我所知,Firebug 的性能分析就是通过 inject 代码到各个函数中来实现的)。
在控制台的listener中,只能显示函数的第一行,如果你写的函数是多行的,那就需要把命令打全了:
getEventListeners(document.getElementById("btn1")).click[0].listener
console会把函数的全部都打印出来。
$(function(){
$("#atest1").click(function(e){
console.log("进入a链接跳转2");
location.href="http://www.baidu.com/?t="+new Date().getTime();
console.log("a链接跳转已经执行3");
});
setTimeout(function(){
document.addEventListener('click', function(e){
console.log("document事件捕获开始1");
// 通知浏览器不要执行与事件关联的默认动作。
// e.preventDefault();
console.log(e.toElement);
//控制台执行有效
//getEventListeners($("a#atest1").get(0)).click[0].remove();
// 显示当前目标元素的绑定事件有哪些
var a=$(e.toElement);
var p = $._data(a[0], 'events').click[0].handler;
if(p.toString().indexOf("location")>0){
$._data(a[0], 'events').click[0].handler=function(){}
}
$.get("http://www.raodaor.com/test/tag.ashx?stm=1464233065021", function(){
console.log("ajax");
if(p.toString().indexOf("location")>0){
$._data(a[0], 'events').click[0].handler=p();
}
});
}, true);
},1000);
});