2011-03-14 232 views
7

我正在寻找一种方法,我可以列出所有事件监听器绑定与JS(或其他脚本以及)在网站上制作。主要我想找出双重绑定(出于调试原因),但我想还有其他问题。有没有办法在javascript中获取所有事件监听器绑定?

辉煌将是一个浏览器插件,你可以在网站上看到哪些元素具有哪些事件监听器绑定的插件。要知道,事件侦听器的一些可视化...

感谢链接,脚本和评论;-)

+2

有这样的jQuery的。它的萤火虫扩展名为firequery:http://firequery.binaryage.com/但我不知道它是否也适用于原生javascript事件。 – meo 2011-03-14 09:44:56

+0

hm ...这是第一步...可能需要时间来适应它 – helle 2011-03-14 12:28:35

回答

2

只有一种类型的事件声明的,你得到它,我不知道这是否将帮助你:

// Can't get 
myDiv.attachEvent ("onclick", function() {alert (1)}); 

// Can't get 
myDiv.addEventListener ("click", function() {alert (1)}, false); 

// Can't get 
<div onclick = "alert (1)"></div> 

// Can get 
myDiv.onclick = function() {alert (1)} 

你也可以看看answer。无论如何,我为你做了一个功能:

<!DOCTYPE html> 

<html> 
    <head> 
     <script> 
      function getAllEvents() { 
       var all = document.getElementsByTagName ("*"); 
       var _return = ""; 

       for (var i = 0; i < all.length; i ++) { 
        for (var ii in all[i]) { 
         if (typeof all[i][ii] === "function" && /^on.+/.test (ii)) { // Unreliable 
          _return += all[i].nodeName + " -> " + ii + "\n"; 
         } 
        } 
       } 

       return _return; 
      } 

      document.addEventListener ("DOMContentLoaded", function() { 
       var div = this.getElementsByTagName ("div")[0]; 

       div.onclick = function() { 
        alert (1); 
       } 

       div.onmouseout = function() { 
        alert (2); 
       } 

       alert (getAllEvents()); 
      }, false); 
     </script> 

     <style> 
      div { 
       border: 1px solid black; 
       padding: 10px; 
      } 
     </style> 
    </head> 

    <body> 
     <div></div> 
    </body> 
</html> 
4

视觉事件(http://www.sprymedia.co.uk/article/Visual+Event+2)是非常有益的。转到此页面,只需将“视觉事件”链接拖到书签栏即可。当你想检查一个页面,只需点击它,等待一秒钟,每个元素的事件将被覆盖在页面上。

1

我只是写了一个脚本,可以让你做到这一点。它给你两个全局函数:hasEvent(Node elm, String event)getEvents(Node elm),你可以使用它。要知道,它修改EventTarget原型法add/RemoveEventListener,并通过HTML标记或elm.on_event = ... JavaScript语法添加事件不工作,仅适用于add/RemoveEventListener

More info at GitHub

Live Demo

脚本:

var hasEvent,getEvents;!function(){function b(a,b,c){c?a.dataset.events+=","+b:a.dataset.events=a.dataset.events.replace(new RegExp(b),"")}function c(a,c){var d=EventTarget.prototype[a+"EventListener"];return function(a,e,f,g,h){this.dataset.events||(this.dataset.events="");var i=hasEvent(this,a);return c&&i||!c&&!i?(h&&h(),!1):(d.call(this,a,e,f),b(this,a,c),g&&g(),!0)}}hasEvent=function(a,b){var c=a.dataset.events;return c?new RegExp(b).test(c):!1},getEvents=function(a){return a.dataset.events.replace(/(^,+)|(,+$)/g,"").split(",").filter(function(a){return""!==a})},EventTarget.prototype.addEventListener=c("add",!0),EventTarget.prototype.removeEventListener=c("remove",!1)}(); 
相关问题