Хороший вопрос. В то время, когда был задан вопрос, универсально реализованного способа выполнения «запросов с корневым комбинатором» (как их назвал Джон Ресиг ) не существовало.
Теперь был представлен псевдокласс : scope . Он не поддерживается в [pre-Chrominum] версиях Edge или IE, но уже несколько лет поддерживается Safari. Используя это, ваш код может стать:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Обратите внимание, что в некоторых случаях вы также можете пропустить .querySelectorAll
и использовать другие старые добрые функции DOM API. Например, вместо того, чтобы myDiv.querySelectorAll(":scope > *")
вы могли просто написать myDiv.children
, например.
В противном случае, если вы еще не можете полагаться на него :scope
, я не могу придумать другого способа справиться с вашей ситуацией без добавления дополнительной логики настраиваемого фильтра (например, найти myDiv.getElementsByClassName("foo")
чей .parentNode === myDiv
), и, очевидно, не идеален, если вы пытаетесь поддерживать один путь кода, который действительно просто хочет принять произвольную строку селектора в качестве ввода и список совпадений в качестве вывода! Но если вы, как и я, задали этот вопрос просто потому, что застряли, думая «все, что у вас было, это молоток», не забывайте, что DOM предлагает множество других инструментов.