2013-01-17 18 views
89

würde ich gerne wissen, was genau ist der Unterschied zwischen querySelector und querySelectorAll gegen getElementsByClassName und getElementById?querySelector und querySelectorAll vs getElementsByClassName und getElementById in JavaScript

Von this link konnte ich entnehmen, dass mit querySelector ich document.querySelector(".myclass") schreiben können Elemente mit Klasse myclass und document.querySelector("#myid") zu bekommen Element mit myid ID zu bekommen. Aber ich kann das schon tun getElementsByClassName und getElementById. Welcher sollte bevorzugt werden?

Auch ich arbeite in XPages, wo die ID dynamisch mit Doppelpunkt generiert wird und so aussieht view:_id1:inputText1. Also wenn ich document.querySelector("#view:_id1:inputText1") schreibe, funktioniert es nicht. Aber schreiben document.getElementById("view:_id1:inputText1") funktioniert. Irgendwelche Ideen warum?

+0

querySelector zur Abfrage einer HTML DOM-Struktur verwendet wird, die für die Abfrage ... html-Element und seine Attribute als Schlüsselelemente enthalten können Sie reguläre Ausdrücke dieses .. Dojo erreichen nutzen können. query() macht das Gleiche – anix

+0

Meinst du nicht 'document.querySelectorAll (". myclass ")'? Mit 'document.querySelector (". Myclass ")' wird nur das erste übereinstimmende Element zurückgegeben. – mhatch

Antwort

65

Ich würde gerne wissen, was genau ist der Unterschied zwischen querySelector und querySelectorAll gegen getElementsByClassName und getElementById?

Die Syntax und die Browser-Unterstützung.

querySelector ist sinnvoller, wenn Sie komplexere Selektoren verwenden möchten.

z.B. Alle Listenelemente von einem Element ab, die ein Mitglied der Foo-Klasse ist: .foo li

document.querySelector ("# Ansicht: _id1: inputText1") es funktioniert nicht. Aber das Schreiben von document.getElementById ("view: _id1: inputText1") funktioniert. Irgendwelche Ideen warum?

Das Zeichen : hat eine besondere Bedeutung in einem Selektor. Du musst ihm entkommen. (Das Selektor-Escape-Zeichen hat auch eine besondere Bedeutung in einer JS-Zeichenkette, also müssen Sie auch , die ist, entgehen).

document.querySelector("#view\\:_id1\\:inputText1") 
+4

Irgendwelche Ideen zur Leistung, wie ist das besser? – Naveen

+1

Es wird von Browser zu Browser (und von Version zu Version) variieren. Ich würde den Wähler basiert ist teurer waren übernehmen (aber nicht in eine Weise, die wahrscheinlich jemals von Bedeutung sein wird) – Quentin

+2

@Naveen: Könnten Sie einen zusammenfassenden Abschluss Ihrer JSPerf hinzufügen, nicht nur einen Link? Die Website ist zum Beispiel heute offline und ich frage mich, wie sich die Leistung für Klassen vergleichen lässt. Vielen Dank! – jtheletter

5

querySelector und querySelectorAll sind eine relativ neue APIs, während getElementById und getElementsByClassName haben bei uns für viel länger. Das bedeutet, dass das, was Sie verwenden, hauptsächlich davon abhängt, welche Browser Sie unterstützen müssen.

Wie für die :, hat es eine besondere Bedeutung, so dass Sie es entkommen müssen, wenn Sie es als Teil eines ID/Klassen-Namen verwenden müssen.

+1

Irgendwelche Ideen zur Leistung, wie ist das besser? – Naveen

+10

Dies ist nicht unbedingt wahr. Zum Beispiel ist 'querySelectorAll' in IE8 verfügbar, während' getElementsByClassName' nicht verfügbar ist. – DaveJ

+0

'querySelectorAll' ... im Grunde alles: http://caniuse.com/#search=querySelectorAll – dsdsdsdsd

15

querySelector kann eine vollständige CSS (3) sein -Selector mit IDs und Klassen und Pseudo-Klassen zusammen wie folgt aus:

'#id.class:pseudo' 

// or 

'tag #id .class .class.class' 

mit getElementByClassName können Sie festlegen, nur eine Klasse

'class' 

mit getElementById können Sie einfach eine ID definieren

'id' 
+1

Ist ': first' ein CSS-Selektor, jetzt? ': first-class' oder': first-of-type' vielleicht, aber ich dachte '' first'' wäre ein JavaScript/jQuery/Sizzle-Zusatz. –

+0

Ich wollte dir nur zeigen, dass ': pseudo-syntax' – algorhythm

+0

@DavidThomas möglich ist, Ja, es ist, ist es ein Teil von CSS3. Es kann so verwendet werden: http://css-tricks.com/almanac/selectors/f/first-child/ – algorhythm

50

Sammeln von Mozilla Documentation:

Die NodeSelector Schnittstelle Diese Spezifikation zwei neue Methoden zu beliebigen Objekten fügt das Dokument, die Document oder Element Schnittstellen Implementierung:

querySelector

Gibt die erste passende Element Knoten innerhalb des Teilbaums des Knotens. Wenn kein übereinstimmender Knoten gefunden wird, wird null zurückgegeben.

querySelectorAll

Gibt eine NodeList alle Anpasselement Knoten innerhalb des Teilbaums des Knotens enthält, oder ein leerer NodeList Wenn keine Übereinstimmungen gefunden werden.

und

Hinweis: Der NodeList von querySelectorAll() zurückgegeben Leben nicht. Dies ist , das sich von anderen DOM-Abfragemethoden unterscheidet, die Live-Node-Listen zurückgeben.

+11

+1 für die Unterscheidung der Live-Knotenliste.Das ist ein extrem wichtiger Unterschied, den Sie beachten sollten, je nachdem, wie Sie die Ergebnisse verwenden möchten. – jmbpiano

+4

was bedeutet "ist nicht live" bedeutet ... danke – dsdsdsdsd

+2

"live" bedeutet Knoten in DOM-Laufzeit hinzugefügt und kann auf dem neu hinzugefügten Knoten arbeiten – diEcho

33

Über die Unterschiede gibt es ein wichtiges Thema in den Ergebnissen zwischen querySelectorAll und getElementsByClassName: der Rückgabewert unterscheidet. querySelectorAll wird eine statische Sammlung zurückgeben, während getElementsByClassName eine Live-Sammlung zurückgibt. Dies könnte zu Verwirrung führen, wenn Sie die Ergebnisse in einer Variablen für die spätere Verwendung speichern:

  • Eine Variable erzeugt mit querySelectorAll wird die Elemente enthalten, die die Wähler im Moment erfüllen die Methode genannt wurde.
  • Eine Variable, die mit getElementsByClassName generiert wurde, enthält die Elemente, die den Selektor erfüllt haben, wenn sie verwendet wird (was von dem Moment abweichen kann, als die Methode aufgerufen wurde).

zum Beispiel feststellen, wie auch wenn Sie die Variablen nicht neu zugewiesen haben aux1 und aux2, sie unterschiedliche Werte enthalten, nachdem die Klassen Aktualisierung:

// storing all the elements with class "blue" using the two methods 
 
var aux1 = document.querySelectorAll(".blue"); 
 
var aux2 = document.getElementsByClassName("blue"); 
 

 
// write the number of elements in each array (values match) 
 
console.log("Number of elements with querySelectorAll = " + aux1.length); 
 
console.log("Number of elements with getElementsByClassName = " + aux2.length); 
 

 
// change one element's class to "blue" 
 
document.getElementById("div1").className = "blue"; 
 

 
// write the number of elements in each array (values differ) 
 
console.log("Number of elements with querySelectorAll = " + aux1.length); 
 
console.log("Number of elements with getElementsByClassName = " + aux2.length);
.red { color:red; } 
 
.green { color:green; } 
 
.blue { color:blue; }
<div id="div0" class="blue">Blue</div> 
 
<div id="div1" class="red">Red</div> 
 
<div id="div2" class="green">Green</div>

+2

Nur um zu erwähnen - Alle älteren DOM Apis Rückgabe einer Knotenliste nämlich 'document.getElementsByName ',' document.getElementsByTagNameNS' oder 'document.getElementsByTagName' zeigen dasselbe Verhalten. – RBT

+1

Einige Analysen sagt QuerySelector dauert länger als getElementById, wie hier https://www.dimlucas.com/index.php/2016/09/17/jquery-vs-geelementbyid-vs-queryselector/. Was passiert, wenn wir die Zugriffszeit berücksichtigen? Nimmt der Live-Knoten von getElementById mehr Zeit in Anspruch als der statische Knoten von querySelector? – Eric

6

ich dazu kam Seite rein, um die bessere Methode, herauszufinden, in Bezug auf Leistung verwenden - das heißt, die schneller ist:

querySelector/querySelectorAll or getElementsByClassName 

und ich fand dies: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18

Es läuft ein Test auf den 2 x Beispiele oben, plus es Futter in einem Test für die auch äquivalente Wähler jQuery. meine Testergebnisse waren wie folgt:

getElementsByClassName = 1,138,018 operations/sec - <<< clear winner 
querySelectorAll = 39,033 operations/sec 
jquery select = 381,648 operations/sec 
Verwandte Themen