2012-09-08 37 views
26

Estoy probando el bucle en los elementos seleccionados que consultaron con document.querySelectorAll, pero ¿cómo?Cómo recorrer los elementos seleccionados con document.querySelectorAll

Por ejemplo yo uso:

var checkboxes = document.querySelectorAll('.check'); 
for(i in checkboxes) { 
    console.log(checkboxes[i]); 
} 

Salida:

<input id="check-1" class="check" type="checkbox" name="check"> 
<input id="check-2" class="check" type="checkbox" name="check"> 
<input id="check-3" class="check" type="checkbox" name="check"> 
<input id="check-4" class="check" type="checkbox" name="check"> 
<input id="check-5" class="check" type="checkbox" name="check"> 
<input id="check-6" class="check" type="checkbox" name="check"> 
<input id="check-7" class="check" type="checkbox" name="check"> 
<input id="check-8" class="check" type="checkbox" name="check"> 
<input id="check-9" class="check" type="checkbox" name="check"> 
<input id="check-10" class="check" type="checkbox" name="check" checked=""> 

10 
item() 
namedItem() 

Mi problema es que al final este método devuelve 3 artículos adicionales. ¿Cómo puedo hacerlo correctamente?

+0

Hola! No estoy seguro de entender su problema ... ¿Podría publicar su código HTML y el resultado que obtiene con mayor claridad? – Littm

+0

Este artículo debería explicarlo bastante bien: http://www.nczonline.net/blog/2010/09/28/why-is-getelementsbytagname-faster-that-queryselectorall/ – wwaawaw

Respuesta

28

for in No se recomienda el bucle para matrices y objetos similares a una matriz; ya ve por qué. Puede haber algo más que solo elementos indexados por número, por ejemplo, la propiedad length o algunos métodos, pero for in recorrerá todos ellos. Utilizar cualquiera

for (var i = 0, len = checkboxes.length; i < len; i++) { 
    //work with checkboxes[i] 
} 

o

for (var i = 0, element; element = checkboxes[i]; i++) { 
    //work with element 
} 

La segunda manera no se puede utilizar si algunos elementos de matriz pueden ser Falsy (no su caso), pero puede ser más fácil de leer, ya que no es necesario para usar la notación [] en todas partes.

15

Una buena alternativa es:

[].forEach.call(
    document.querySelectorAll('.check'), 
    function (el) { 
     console.log(el); 
    } 
); 

pero como se ha señalado, se debe utilizar un bucle.

+2

La sobrecarga es más que solo usar un bucle for desafortunadamente, es una buena solución. – MarkLunney

+3

Publicación interesante sobre este método: http://toddmotto.com/ditch-the-array-foreach-call-nodelist-hack/ – twe4ked

+2

Si se toma este enfoque, sería mejor hacer el 'querySelectorAll' antes y pasar el resultado en el bucle 'forEach' (por ejemplo,' var elements = document.querySelectorAll ('. check'); [] .forEach.call (elements, ...); '). De lo contrario, terminará haciendo innecesariamente la misma consulta DOM una y otra vez en cada iteración del ciclo. –

9

Mi favorito es usar spread operator para convertirlo a una matriz y luego usar forEach para bucles.

var div_list = document.querySelectorAll('div'); // returns NodeList 
var div_array = [...div_list]; // converts NodeList to Array 
div_array.forEach(div => { 

// do something awesome with each div 

}); 

código I en ES2015 y utilizar Babel.js lo que no debería ser un problema de soporte del navegador.

+0

Aquí hay una respuesta moderna. –

7

Con ES6, no es un método estático Array.from para tomar ventajas de Array métodos no estáticos (forEach, mapa, filtra, ..):

Array.from(document.querySelectorAll('div')).forEach((element,index) => 
{ 

    // handle "element" 

}); 

Otro, el uso de Array.from desde querySelector proporciona item método:

var all=document.querySelectorAll('div'); 
// create range [0,1,2,....,all.length-1] 
Array.from({length:all.length},(v,k)=>k).forEach((index)=>{ 
    let element=all.item(index); 
}); 
1

parece que Firefox 50+, 51+ Chrome y Safari 10+ ahora son contribuyentes al .forEach función para objetos NodeList. Nota: .forEach no es compatible con Internet Explorer, por lo tanto, considere uno de los enfoques anteriores si se requiere soporte de IE.

https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach

const paragraphs = document.querySelectorAll('p'); 
 
paragraphs.forEach(p => console.log(p));
<p>paragraph 1</p> 
 
<p>paragraph 2</p> 
 
<p>paragraph 3</p> 
 
<p>paragraph 4</p> 
 
<p>paragraph 5</p>

0

ES6 const checkboxes = Array.from(document.querySelectorAll('.check'));

Cuestiones relacionadas