2015-05-27 13 views
10

Dalla mia comprensione,Differenza tra getElementsByClassName e querySelectorAll?

var elems = document.querySelectorAll(".class"); 
var elems = document.getElementsByClassName("class"); 

dovrebbe restituire le stesse cose. Tuttavia, quando provo a rimuovere la classe da tutti gli elementi usando

for (var i = 0; i < elems.length; ++i) 
    elems[i].className = ""; 

Ottengo risultati diversi. querySelectorAll rimuove correttamente le classi da tutti gli elementi, ma getElementsByClassName rimuove solo le classi da circa la metà degli elementi.

Cosa sta succedendo?

+0

Prezioso! Grazie! –

risposta

20

querySelectorAll non restituisce elementi DOM dal vivo. Le modifiche successive alla struttura del documento sottostante non si rifletteranno nell'oggetto NodeList restituito da querySelectorAll. Ciò significa che l'oggetto conterrà invece un elenco di nodi Element corrispondenti che erano nel documento al momento della creazione dell'elenco.

getElementsByClassName restituisce elementi DOM dal vivo. Qualsiasi modifica successiva apportata a tali elementi DOM si rifletterà nell'elenco.

+0

Che cosa significa "elemento DOM live"? – zerkms

+0

An [* HTMLCollection *] (http://www.w3.org/TR/2011/WD-html5-author-20110705/common-dom-interfaces.html#htmlcollection-0). – RobG

+0

Ecco fatto! Ed è molto utile, si occupa di chiamate AJAX. Grazie! –

3

Per espandere la risposta di Anirudha, quando si cambiano i nomi delle classi sulla lista degli elementi dal vivo recuperati da getElementsByClassName, si riduce il numero di risultati (poiché gli elementi disponibili nell'elenco sono presenti solo perché hanno la classe nome).

Pertanto la proprietà elems.length viene ridotta di un'unità ad ogni iterazione e si ottiene solo metà degli elementi.