2015-09-06 3 views
0

В моем коде я использую querySelectorAll для создания nodeList.Javascript Filter childNodes by CSS Класс

var a = document.querySelectorAll('tbody > tr.editable:not(.empty-bench)') 

Этот массив содержит ~ 17 элементов, и я хочу, чтобы иметь возможность фильтровать эти результаты, где childNode имеет определенный класс.

В настоящее время я использую a[0].childNodes, но это отображает всех детей. Я только хочу, чтобы вернуть определенные те, которые содержат класс .P-xs

+0

'TBODY> tr.editable: нет (.empty-скамья)> .P-xs'? –

+0

'querySelectorAll' возвращает' NodeList' или 'null', а не' Array'. – Oriol

+0

Не уверен, что я понимаю, но попробуйте 'querySelectorAll ('tbody> tr.editable: not (.empty-bench) .P-xs')' – Oriol

ответ

2

According to this, вы должны быть в состоянии затем вызвать a[0].querySelectorAll('.P-xs')

+0

Я выбрал ваш, потому что это было самое простое решение – Bijan

3

Вы можете использовать Function.prototype.call заимствовать Array.prototype.filter и быть в состоянии использовать его на NodeList:

var a = document.querySelectorAll('tbody > tr.editable:not(.empty-bench)'); 
var b = [].filter.call(a, function(el) { 
    return el.classList.contains('P-xs'); 
}); 
1

Вы можете использовать цикл for в своем исходном селекторе запроса для создания массива, содержащего только те элементы с заданным потомком. См. Пример ниже.

var a = document.querySelectorAll('#one'); 
 
var b = []; 
 
for (var i = 0; i < a.length; i++) { 
 
    if (a[i].querySelectorAll('#two').length) { 
 
    b.push(a[i]); 
 
    } 
 
} 
 
b.forEach(function (item, i, array) { 
 
    item.style.color = 'red'; 
 
});
<div id="one"> 
 
    One 
 
</div> 
 

 
<div id="one"> 
 
    <div id="two">Two</div> 
 
</div>

1

Если вы ищете для childNode содержит P-xs класс, то попробуйте это. Он будет возвращать массив всех дочерних узлов, имеющих этот класс.

var a = document.querySelectorAll('tbody > tr.editable:not(.empty-bench)'); 
var afterFilter = [].concat.apply([], [].map.call(a, function (el) { 
    return [].filter.call(el.childNodes, function (ch) { 
     return ch.nodeType === 1 && ch.classList.contains('P-xs'); 
    }); 
})); 

Но если вы хотите, родитель попробуйте ниже:

var a = document.querySelectorAll('tbody > tr.editable:not(.empty-bench)'); 
var afterFilter = [].map.call(a, function(el) { 
    return [].filter.call(el.childNodes, function (ch) { 
     return ch.nodeType === 1 && ch.classList.contains('spec'); 
    }); 
});