Хороший вопрос. В то время, когда об этом спрашивали, универсально реализованного способа выполнения «корневых запросов комбинатора» (как его назвал Джон Резиг ) не существовало.
Теперь введен псевдокласс : 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.