Найти все элементы имеют какой-либо атрибут, отличный от некоторых определенных атрибутов

60
4

Как я могу найти, что все элементы имеют какой-либо атрибут, отличный от некоторых определенных атрибутов? например: любые другие атрибуты excepts (href + title + id).

спросил(а) 2013-01-09T02:32:00+04:00 8 лет, 1 месяц назад
1
Решение
61

Единственный способ сделать это - перебрать ВСЕ элементы на странице и отфильтровать те, которые вы не хотите.

В этой реализации вы передаете массив атрибутов, которые вы хотите игнорировать (и, возможно, тип тега), и он возвращает массив элементов, которые имеют некоторый атрибут, отличный от одного из тех, которые вы передали:

function getElemsWithOtherAttribute(attArray, tags) {
tags = tags || "*";
// put all passed in attributes in an object for fast lookup
// add leading underscore to avoid any built-in property conflicts
var attLookup = {}, i, j, len, results = [], atts;
for (i = 0, len = attArray.length; i < len; i++) {
attLookup["_" + attArray[i].toLowerCase()] = true;
}
// get all elements and loop through them all
var elems = document.getElementsByTagName(tags);
for (i = 0, len = elems.length; i < len; i++) {
// get all attributes on this element and loop through them all
// until we find one that isn't in our attLookup object
atts = elems[i].attributes;
for (j = 0; j < atts.length; j++) {
// if we have an attribute name that is not in our passed in list, then
// add this element to the results array
if (attLookup["_" + atts[j].name.toLowerCase()] !== true) {
results.push(elems[i]);
break;
}
}
}
return(results);
}

// example usage
var regAttributes = ["href", "title", "id"];
var items = getElemsWithOtherAttribute(regAttributes, "img");

Это использует коллекцию .attributes для получения списка всех атрибутов, указанных в HTML для данного элемента, а затем ищет свойство .name на узле атрибута, чтобы узнать, что такое имя данного атрибута.

ответил(а) 2013-01-09T02:39:00+04:00 8 лет, 1 месяц назад
75

var attrs = ["href", "title", "id"],
els = document.getElementsByTagName("*"),
result = Array.prototype.slice.call(els).filter(function(el) {
if (el.attributes.length === 0)
return false;

for (var i = 0, l = attrs.length; i < l; i++) {
if (el.hasAttribute(attrs[i]))
return false;
}
return true;
});

console.log(result);

ответил(а) 2013-01-09T02:41:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема