2017-01-20 3 views
-1

У меня есть нодлист объектов, возвращаемых вызовом document.getElementsByClassName('a'). Некоторые из этих объектов имеют дополнительный класс b. Как создать массив элементов, содержащих оба класса? Я не пользовался глобальным поиском для b. Я предпочитаю код vanillaJS/ES6.Фильтровать объекты по классуName from nodeList

пример HTML-код:

<div class ="a"></div> 
<div class ="a"></div> 
<div class ="a b"></div> 
<div class ="a"></div> 
<div class ="a b"></div> 
<div class ="a"></div> 
+2

Вы можете показать соответствующую разметку? – RomanPerekhrest

+1

Ваш вопрос немного неоднозначен. Вы хотите получить результат, который имеет элементы обоих классов, или вы хотите получить результат, который имеет только элементы с обоими классами. –

+0

Жаль, что я не был конкретным. Ясно, что я хочу, чтобы класс 'a' индексировал индекс объектов, содержащих класс 'b'. – ClassicError

ответ

4

Try querySelector вместо этого.

document.querySelectorAll('.a.b'); 

Это, скорее всего, ваше самое простое решение.

+0

Да, но это не позволяет мне взять indexOf этот элемент из списка «a» – ClassicError

+1

@ClassicError: Что это связано с вашим вопросом? Что вы на самом деле пытаетесь сделать? –

2

В дополнении к решению с помощью Element.querySelectorAll(), document.getElementsByClassName() могут быть использованы для поиска элементов с первым именем класса, то filter() может быть использовано, чтобы держать только те элементы, которые имеют второй класс, используя Element.classList.contains() включать только элементы с оба классом имена. См. Демонстрацию ниже.

Обратите внимание, что она использует function.call, чтобы вызвать функцию фильтра, так как document.getElementsByClassName() возвращает NodeList, который имеет другой прототип, чем у Array.

var aElements = document.getElementsByClassName('a'); 
 
var abElements = Array.prototype.filter.call(aElements, function(element, index, aElements) { 
 
    return element.classList.contains('b'); 
 
}); 
 
console.log(abElements);
<div class="a"></div> 
 
<div class="a"></div> 
 
<div class="a b"></div> 
 
<div class="a"></div> 
 
<div class="a b"></div> 
 
<div class="a"></div>

Обратите внимание, что Element.classList имеет ограниченную поддержку браузера (например, не в IE 9-), поэтому для того, чтобы проверить для класса б без использования этого имущества, можно разделить имена классов (используя свойство имя класса) в массив и использовать Array.indexOf():

var aElements = document.getElementsByClassName('a'); 
 
var abElements = Array.prototype.filter.call(aElements, function(element, index, aElements) { 
 
    var classNames = element.className.split(' '); 
 
    return classNames.indexOf('b') > -1; 
 
}); 
 
console.log(abElements);
<div class="a"></div> 
 
<div class="a"></div> 
 
<div class="a b"></div> 
 
<div class="a"></div> 
 
<div class="a b"></div> 
 
<div class="a"></div>

Смежные вопросы