2011-11-09 40 views
1

我想要查找页面内的任何标签是否包含js事件属性,如onload,onunload,onfocus等...... 为此,我有要事要检查的数组(我觉得我有他们全部):测试DOM中的所有元素节点的属性存在

var attr = [ 
"onLoad", 
"onunload", 
"onclick", 
"ondblclick", 
"onmousedown", 
"onmouseup", 
"onmouseover", 
"onmousemove", 
"onmouseout", 
"onfocus", 
"onblur", 
"onkeypress", 
"onkeydown", 
"onkeyup", 
"onsubmit", 
"onreset", 
"onselect", 
"onchange"]; 

,然后我得到的所有elementsByTagName,并要检查其属性:

var getAttrs = function() { 
var i = 0, 
    j, 
    all = document.getElementsByTagName('*'), 
    max = all.length, 
    eventsLen = attr.length; 


for (; i < max; i++) { 

    console.log('iterating through objects'); 

    for (j = 0; j < eventsLen; j++) { 

     if (all[i].hasAttribute(attr[j])) { 
      console.log('found an instance of an intrinsec event', attr[j]); 
     } 

    } 

} 

}; 

这不是工作,我没有得到任何我想找到的属性。我想要找到所有使用javascript的标签中的所有属性:(例如,在< a href =“javascript:void(0)”>)任何想法如何将其添加到函数的逻辑?

谢谢!

+0

当我尝试这个,它的工作原理:P – mquander

回答

0

变化:

if (all[i].hasAttribute(attr[j])) { 

到:

if (all[i][attr[j]]) { 

,因为它也可以是一个属性,并相对于一个属性。

+0

...取决于OP是否希望包含以编程方式添加的事件处理程序(如'elem.onclick = function(){...};'或者他只是想从HTML源代码... –

1

如果你想获得其中有任一属性的所有元素,下面的代码可用于:

var attr = ["onLoad", "onunload", "onclick", "ondblclick", "onmousedown", 
      "onmouseup", "onmouseover", "onmousemove", "onmouseout", "onfocus", 
      "onblur", "onkeypress", "onkeydown", "onkeyup", "onsubmit", "onreset", 
      "onselect", "onchange", "href^='javascript:'"]; 
var selector = "[" + attr.join("],[") + "]"; 
//selector looks like "[onLoad][onunload]...[href^='javascript:']" 
var eitherAttribute = document.querySelectorAll(selector); 
for(var i=0, len=eitherAttribute.length; i<len; i++){ 
    console.log(eitherAttribute[i]); //Logs the element 
} 

如果您想选择匹配多个属性,所有的元素,使用:

//Example: onclick, AND href starting with javascript: 
document.querySelectorAll("[onclick][href^='javascript:']"); 

欲了解更多信息,请参阅MDN: document.querySelectorAll
如果你需要更灵活的选择,看看:MDN: Selectors

0

这是我会怎么做:

var checkForEventAttrs = (function() { 
    var eventAttrs = [ /* a list of attribute name strings */ ]; 

    function walkTheDOM(node, func) { 
      func(node); 
      node = node.firstElementChild; 
      while (node) { 
       walkTheDOM(node, func); 
       node = node.nextElementSibling; 
      } 
    } 

    return function() { 
     walkTheDOM(document.body, function (node) { 
      eventAttrs.forEach(function (eventAttr) { 
       if (node.hasAttribute(eventAttr)) { 
        console.log('The attribute ' + eventAttr + ' found.'); 
       } 
      }); 
     }); 
    }; 
})(); 

,然后只需要调用该函数的那些属性登录到控制台:

checkForEventAttrs(); 

现场演示:http://jsfiddle.net/F5AEy/