2011-06-10 12 views
8

Por lo que he entendido, querySelector devuelve un elemento real cambiable, mientras que querySelectorAll devuelve un conjunto de nodos estáticos no vivos.querySelectorAll: manipulación de nodos

Quiero ajustar el estilo de todos los elementos que se ajustan a un selector específico. Funciona bien para el primer elemento con querySelector, pero no para todos los elementos coincidentes con querySelectorAll. Supongo que es porque el conjunto de nodos no es en vivo.

¿Hay una solución? ¿O me estoy perdiendo algo?

Respuesta

9

El problema es que querySelector devuelve un solo nodo. querySelectorAll devuelve un conjunto de nodos (la vida útil significa que los elementos en el conjunto no se eliminarán si los actualizas). Necesita establecer un estilo en cada uno de los elementos combinados, probablemente con un bucle; no puede establecer una propiedad para todos ellos.

Por lo tanto, es probable que tenga que hacer algo como esto:

var nodes = document.querySelectorAll('div.foo'); 
for (var i = 0; i < nodes.length; i++) { 
    nodes[i].style.color = 'blue'; 
} 
+0

¡Muchas gracias! Intenté eso pero no funcionó, así que pensé que era debido a que el nodeset no estaba en vivo. Pero en realidad me olvidé de inicializar el iterador (= 0) ... – fabb

5

Esto también funciona ..

[].forEach.call(document.querySelectorAll('div.foo'), function (el) { 
    el.style.color = 'blue'; 
}); 
+0

Me resulta interesante que lo anterior funcione, pero 'document.querySelectorAll ('div.foo'). ForEach (función (e1) ...' doesn no funciona. ¿Alguna idea de por qué? –

+1

querySelectorAll devuelve un NodeList, que no tiene para cada. Consulte: https://developer.mozilla.org/en-US/docs/Web/API/NodeList#Why_is_NodeList_not_an_Array.3F – seans

1

Como se describe en querySelectorAll: manipulating nodes pero con una manera de hacer que funcione, ya que forEach solo funciona en Arrays, no en NodeLists:

Array.prototype.slice.call(document.querySelectorAll('div.foo')).forEach(function(el) { 
    el.style.color = 'blue'; 
});