javascript - ejemplos - Selector secundario usando `querySelectorAll` en una colección DOM
queryselector value (3)
Debido a que la ul
devuelta es una NodeList, no se repite implícitamente sobre su contenido como una colección jQuery. Necesitaría usar ul[0].querySelectorAll()
o mejor aún, seleccione la ul
con querySelector()
.
Además de eso, querySelectorAll()
no tomará un >
y trabajará desde su contexto actual. Sin embargo, puede hacer que funcione con la respuesta de lazd (aunque verifique la compatibilidad del navegador), o cualquiera de estas soluciones (que no deberían tener problemas con el navegador) ...
[].filter.call(ul.querySelectorAll("li"), function(element){
return element.parentNode == ul;
});
jsFiddle .
Esto seleccionará todos los elementos li
que son descendientes de su ul
, y luego eliminará los que no son descendientes directos.
Alternativamente, puedes obtener todos los childNodes
y luego filtrarlos ...
[].filter.call(ul.childNodes, function(node) {
return node.nodeType == 1 && node.tagName.toLowerCase() == ''li'';
});
jsFiddle .
Supongamos que tienes una lista con listas de niños anidadas.
<ul>
<li></li>
<li>
<ul>
<li></li>
<li></li>
</ul>
</li>
<li></li>
</ul>
Y use document.querySelectorAll()
para hacer una selección:
var ul = document.querySelectorAll("ul");
¿Cómo puedo usar la colección ul
para obtener los elementos secundarios directos?
ul.querySelectorAll("> li");
// Gives ''Error: An invalid or illegal string was specified''
Supongamos que ul
está en caché de alguna manera (de lo contrario, podría haber hecho ul > li
directamente).
En jQuery esto funciona:
$("ul").find("> li");
Pero no lo hace en nativo querySelectorAll
. ¿Alguna solución?
La forma correcta de escribir un selector que esté "arraigado" en el elemento actual es usar :scope
.
ul.querySelectorAll(":scope > li");
Vea mi respuesta aquí para obtener una explicación y una solución robusta para todos los navegadores: https://.com/a/21126966/1170723
NodeList
iterar sobre el NodeList
devuelto por document.querySelectorAll()
y luego llamar a element.querySelectorAll()
para cada elemento en esa lista.