Bonne question. À l'époque où elle a été posée, une méthode universellement mise en œuvre pour effectuer des "combinator rooted queries" (en tant que John Resig les a appelés ) n'existait pas.
Aujourd'hui, le :scope a été introduite. Elle n'est pas soutenu sur les versions [pré-Chrominum] d'Edge ou d'IE, mais il est pris en charge par Safari depuis quelques années déjà. En utilisant cela, votre code pourrait devenir :
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Notez que, dans certains cas, vous pouvez également ignorer l'option .querySelectorAll
et utiliser d'autres bonnes vieilles fonctionnalités de l'API DOM. Par exemple, au lieu de myDiv.querySelectorAll(":scope > *")
vous pouvez simplement écrire myDiv.children
par exemple.
Sinon, si vous ne pouvez pas encore compter sur :scope
Je ne vois pas d'autre moyen de gérer votre situation sans ajouter une logique de filtrage plus personnalisée (par exemple, trouver myDiv.getElementsByClassName("foo")
dont .parentNode === myDiv
), et ce n'est évidemment pas l'idéal si vous essayez de soutenir un chemin de code qui veut juste prendre une chaîne de sélection arbitraire en entrée et une liste de correspondances en sortie ! Mais si comme moi vous avez fini par poser cette question simplement parce que vous étiez bloqué en pensant que "tout ce que vous aviez c'était un marteau", n'oubliez pas qu'il y a une variété de autres les outils offerts par le DOM.