Boa pergunta. Na época em que foi perguntado, não existia uma maneira universalmente implementada de fazer "consultas com raiz de combinador" (como John Resig as chamou ).
Agora a pseudoclasse: scope foi introduzida. Não é compatível com versões [pré-Chrominum] do Edge ou IE, mas já é compatível com o Safari há alguns anos. Usando isso, seu código pode se tornar:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Observe que, em alguns casos, você também pode ignorar .querySelectorAll
e usar outros bons e antigos recursos da API DOM. Por exemplo, em vez de myDiv.querySelectorAll(":scope > *")
você pode apenas escrever myDiv.children
, por exemplo.
Caso contrário, se você ainda não pode confiar em :scope
, não consigo pensar em outra maneira de lidar com sua situação sem adicionar mais lógica de filtro personalizado (por exemplo, encontrar de myDiv.getElementsByClassName("foo")
quem .parentNode === myDiv
), e obviamente não é ideal se você está tentando oferecer suporte a um caminho de código que realmente só quer pegar uma string de seletor arbitrário como entrada e uma lista de correspondências como saída! Mas se, como eu, você acabou fazendo essa pergunta simplesmente porque parou pensando "tudo o que você tinha era um martelo", não se esqueça de que há uma variedade de outras ferramentas que o DOM oferece também.