Тестирование всех узлов элементов в DOM на наличие атрибутов
Я пытаюсь выяснить, содержит ли какой-либо из тегов на странице атрибут события js, например, onload, onunload, onfocus и т. Д.... Для этого у меня есть массив событий для проверки (я думаю, что они есть). все):
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: (например, в ) Любая идея, как я мог бы добавить это к логике функции?
Спасибо!
3 ответа
Если вы хотите получить все элементы, которые имеют какой-либо атрибут, можно использовать следующий код:
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: Селекторы
Изменить:
if (all[i].hasAttribute(attr[j])) {
Для того, чтобы:
if (all[i][attr[j]]) {
Как это может быть также свойство и в отличие от атрибута.
Вот как я бы это сделал:
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/