2017-02-08 22 views
3

Давайте предположим, что у нас есть этот HTML структура:querySelectorAll корневых элементы без использования: область применения

<div id='test-div'> 
    <div class='random-class-1'> 
     <div class='useless-element-1'> 
     </div> 
     <div class='useless-element-2'> 
     </div> 
     <p>Just a paragraph, and useless</p> 
    </div> 
    <div class='random-class-2'> 
     <div class='useless-element-3'> 
     </div> 
     <div class='useless-element-4'> 
     </div> 
     <div class='useless-element-5'> 
     </div> 
    </div> 
</div> 

Мне нужно, чтобы выбрать все детям «DIV элементы» (не внуки) внутри первого DIV (в данном примере с идентификатором = 'test-div'), а не из документа, а из самого элемента (div).

Так что, я не хочу использовать «запрос» ниже, потому что я уже выбран элемент DIV [объект HTMLDivElement]:

// I don't want to use this query 
var children = document.querySelectorAll("div > div"); 

Просто пример для достижения этой цели (https://jsfiddle.net/t4gxt65k/):

// I already have selected DIV element 
var el = document.getElementById("test-div") 
// OR var el = document.querySelectorAll("#test-div"); 

var children = el.querySelectorAll(":scope > div"); 

Но из-за несовместимости браузера я не хочу использовать «: объем»

реальный вопрос:

Как я могу получить детей (только элементы DIV) из [object HTMLDivElement], используя чистый JavaScript?

+0

Прокомментируйте меня, если вопрос не понятно :) – h2odev

+0

Могли бы вы не потом снова пойти и сделать: ' var children = document.querySelectorAll ("# test-div> div") ' – andrew196

+0

Это нормально для этого примера, но в реальном приложении DIV не имеет идентификатора, и у меня есть только [объект HTMLDivElement] – h2odev

ответ

3

Чтобы получить прямые детей элемента используют комбинацию parentNode.children или parentNode.childNodes и Array.prototype.reduce вроде этого:

var children = Array.prototype.reduce.call(el.children, function(acc, e) { 
    if(e.tagName == "DIV") 
     acc.push(e); 
    return acc; 
}, []); 
+0

Является дополнительным ")" в конце :). и он работает – h2odev

+0

Теперь все в порядке, спасибо – h2odev

2

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

// The `scope` variable stores a reference to a scope element. 
var attrName = '_scope' + Date.now(); 
scope.setAttribute(attrName, ''); 
var children = scope.parentNode.querySelector('[' + attrName + '] > DIV'); 

Я не уверен, насколько быстро это происходит.

FWIW, в частности, для получения ребенка элементов, есть свойство children DOM:

var children = scope.children; 
+0

Приятная идея, в основном добавление временного атрибута для использования в качестве ссылки. Любить это! – h2odev