Buena pregunta. En el momento en que se solicitó, no existía una forma implementada universalmente para realizar "consultas con raíz de combinador" (como las llamó John Resig ).
Ahora se ha introducido la pseudoclase: scope . No es compatible con las versiones [anteriores a Chrominum] de Edge o IE, pero Safari ya lo ha admitido durante algunos años. Usando eso, su código podría convertirse en:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Tenga en cuenta que, en algunos casos, también puede omitir .querySelectorAll
y utilizar otras características de la API DOM antiguas. Por ejemplo, en lugar de myDiv.querySelectorAll(":scope > *")
simplemente escribir myDiv.children
, por ejemplo.
De lo contrario, si aún no puede confiar :scope
, no puedo pensar en otra forma de manejar su situación sin agregar más lógica de filtro personalizada (por ejemplo, encontrar de myDiv.getElementsByClassName("foo")
quién .parentNode === myDiv
), y obviamente no es ideal si está tratando de admitir una ruta de código que realmente ¡solo quiere tomar una cadena de selección arbitraria como entrada y una lista de coincidencias como salida! Pero si, como yo, terminaste haciendo esta pregunta simplemente porque te quedaste atascado pensando "todo lo que tenías fue un martillo", no olvides que hay una variedad de otras herramientas que DOM también ofrece.