При использовании querySelectorAll есть ли способ ссылаться на непосредственные дочерние элементы контекстного узла без использования идентификаторов?
скажем, у меня есть структура HTML, как
<div id="a">
<div id="b">
<div id="c"></div>
</div>
</div>
чтобы сделать запрос для детей "a" с помощью querySelectorAll я могу сделать что-то вроде
//Get "b", but not "c"
document.querySelectorAll('#a > div')
у меня вопрос: возможно ли это сделать без идентификатора, ссылаясь непосредственно на узел? Я пытался сделать
var a_div = document.getElementById('a')
a_div.querySelectorAll('> div') //<-- error here
но я получаю сообщение об ошибке, сообщающее мне, что селектор, который я использовал, недействителен.
и в случае, если кому-то интересно, мой реальный случай использования будет чем-то большим сложно, как "> .foo. бар.баз ' поэтому я предпочел бы избежать ручного обхода DOM. В настоящее время я добавляю временный идентификатор в корневой div, но это похоже на уродливый Хак...
3 ответов
нет, нет никакого способа (пока) для ссылки на все дочерние элементы некоторого элемента без использования ссылки на этот элемент. Потому что >
это ребенок комбинатора, который представляет отношение между родительским и дочерним элементом, a простой селектор (родитель) необходим (который отсутствует в вашем примере).
в комментарии BoltClock говорит что селекторы API Уровень 2 спецификация определяет способ findAll
имя мая изменить " который принимает в качестве аргумента то, что, вероятно, будет известно как относительный селектор (селектор, который может начинаться с комбинатора, а не составного селектора)".
Когда это реализовано, его можно использовать следующим образом:
a_div.findAll('> div');
document.querySelector('#a').querySelectorAll(':scope > div')
Я не уверен в поддержке браузера, но я использую его в chrome и chrome mobile packaged apps, и он отлично работает.
Я думаю, что я, должно быть, неправильно понял ваш вопрос, но вот как я его интерпретирую..
var a = document.getElementById('a')
var results = a.querySelectorAll('div');
результаты теперь будут содержать все ваши дочерние divs.