2013-10-28 4 views
0

Я спрашиваю, как реализовать эквивалентную функциональность jQuery's children() с помощью запроса HTML5Slector/querySelectorAll, то есть как я могу назначить текущий элемент в селекторе шаблон.Как сделать querySelectorAll выбирать только из дочерних элементов текущего элемента

Например:

<div id="foo"> 
    <div class="bar" id="div1"> 
     <div class="bar" id="div1.1"> 
     </div> 
    </div> 
    <div class="bar" id="div2"></div> 
    </div> 

С document.getElementById('foo').querySelectAll('div.bar') будут выбраны все три div s. Что делать, если я только хочу получить div1 и div2, а не div1's div1.1? Как написать [[current node]] > div.bar как css-селектор?

Может ли кто-нибудь пролить свет на это?

+0

Если вы регистрируете или предупреждаете innerHTML элемента foo, вы увидите, что браузер передает ваш контент иначе, чем буквальный исходный код. Элементы p замкнуты и разделены, а не содержат внутренние элементы. – kennebec

+0

Получите это! р не должно быть вложены в р .;) – Need4Steed

ответ

0

Вы можете просто использовать, как это:

document.querySelectorAll('#foo > p.bar') 
+0

Но что мне нужно сделать, это передать элемент Е к функции, а функция выбора что-то из детей, E, а не потомки – Need4Steed

1

Там нет Селектор для обозначения элемента, из которого .querySelectorAll называлась (хотя я думаю, что, возможно, было предложено что-то).

Таким образом, вы можете не ничего сделать так:

var result = document.getElementById('foo').querySelectorAll('[[context]] > p.bar'); 

Что вам нужно будет выбрать из документа, и включают в себя #foo ID в селекторе.

var result = document.querySelectorAll("#foo > p.bar"); 

Но если вы должны начать с элемента, один из вариантов будет взять его идентификатор (если он есть) и сцепить его в селекторе.

var result = document.querySelectorAll("#" + elem.id + " > p.bar"); 

Если это возможно, что элемент не имеет идентификатора, то вы можете временно дать ему один.

var origId = elem.id 

if (!origId) { 
    do { 
     var id = "_" + Math.random().toString(16) 
    } while (document.getElementById(id)); 

    elem.id = id; 
} 

var result = document.querySelectorAll("#" + elem.id + " > p.bar"); 

elem.id = origId; 
+0

Хороший цикл, спасибо! – Need4Steed

+0

Добро пожаловать. –

3

В вашем примере вы имеете did id="foo", поэтому приведенный выше пример работает.

Но в ситуации, когда родительский элемент не имеет ID, но вы все еще хотите использовать querySelectorAll, чтобы получить немедленные детей - это также можно использовать :scope ссылаться на элемент, как это:

var div1 = document.getElementById('div1'); //get child 
    var pdiv = div1.parentNode; //get parent wrapper 
    var list = pdiv.querySelectorAll(':scope > div.bar'); 

Здесь запрос будет быть «корни» в pdiv элемент ..

+0

Это слишком кровоточащий край, чтобы быть полезным, на данный момент (и это было предложено в прошлом году!). ': scope' доступен в Chrome или Firefox после включения флага конфигурации и недоступен в IE. – Rolf

1

на самом деле существует псевдо-класс:scope для выбора текущего элемента, однако, это не обозначен как поддерживаются любым Versio n от MS Internet Explorer.

document.getElementById('foo').querySelectAll(':scope>div.bar')