2010-03-09 15 views
43

Wann sollten Sie document.all vs. document.getElementById verwenden?document.all vs. document.getElementById

+7

'dokument.all'? Mann, * das ist alte Schule! –

+2

Alte Schule? Ich habe meine Skripte überprüft und sie scheinen beide Optionen zu verwenden, so dass ältere Browser berücksichtigt werden. Das ist also nicht "Old School", sondern mehr wie Sound-Programmierung, was zeigt, dass die Browser-Hersteller dies als einen Fehler bezeichnen, sind die meisten unwissenden und möglicherweise unerfahrenen Programmierer bei Google beschäftigt. – WilliamK

+1

Fun Tatsache: durch unheilige Konvention, 'typeof document.all === 'undefined'' – sam

Antwort

50

document.all ist eine proprietäre Microsoft-Erweiterung des W3C-Standards.

getElementById() ist Standard - verwenden Sie das.

Überlegen Sie jedoch, ob die Verwendung einer js-Bibliothek wie jQuery praktisch wäre. Zum Beispiel ist $("#id") das jQuery-Äquivalent für getElementById(). Außerdem können Sie more than just CSS3 Selektoren verwenden.

32

document.all ist sehr alt, Sie don't have to use it anymore.

zu zitieren Nicholas Zakas:

Zum Beispiel, wenn das DOM jung war, unterstützt nicht alle Browser getElementById() und so war es ein Menge Code, der wie folgt aussah:

if(document.getElementById){ //DOM 
    element = document.getElementById(id); 
} else if (document.all) { //IE 
    element = document.all[id]; 
} else if (document.layers){ //Netscape < 6 
    element = document.layers[id]; 
} 
+0

Defekten Link entfernt zu http://simonwillison.net/2003/Aug/11/documentAll/ –

5

document.all() ist eine nicht-standardisierte Methode für den Zugriff auf DOM-Elemente. Es ist von einigen Browsern veraltet. Sie erhalten Zugriff auf alle Unterelemente in Ihrem Dokument.

document.getElementById() ist ein Standard und vollständig unterstützt. Jedes Element hat eine eindeutige ID auf dem Dokument.

Wenn Sie:

<div id="testing"></div> 

document.getElementById("testing"); 

Mit Zugang zu diesem speziellen div haben.

2

Und document.all wird ab IE11 nicht unterstützt!

http://msdn.microsoft.com/en-us/library/ie/ms537434(v=vs.85).aspx

+0

Interessant. Jetzt, da Chrome es übernommen hatte, hoffte ich, dass FF beitreten würde, aber wenn MS es sogar fallen lässt, ist es wirklich weg. Ich bevorzuge Dokument.Alle für seine Kürze: document.all.editor ist viel besser zu schreiben und lesen als document.getElementById ("Editor"). – citykid

3

document.querySelectorAll (und seine document.querySelector() Variante, die das erste gefundene Element zurückgibt) ist viel, viel stärker. Sie können ganz einfach:

  • eine ganze Kollektion mit document.querySelectorAll("*") bekommen, effektiv Nicht-Standard-document.all Eigenschaft emuliert;
  • Verwendung document.querySelector("#your-id"), effektiv emulieren document.getElementById() Funktion;
  • Verwendung document.querySelectorAll(".your-class"), effektiv emulieren document.getElementsByClassName() Funktion;
  • verwenden document.querySelectorAll("form") anstelle von document.forms und document.querySelectorAll("a") statt document.links;
  • und führen Sie eine viel komplexere DOM-Abfrage (unter Verwendung eines beliebigen verfügbaren CSS-Selektors) durch, die nicht mit anderen Dokument-Builtins abgedeckt werden kann.

Einheitliche Abfrage API ist der Weg zu gehen. Selbst wenn document.all im Standard wäre, ist es einfach unbequem. Eigentlich

12

, document.all ist nur minimal vergleichbar mit document.getElementById. Du würdest keine anstelle der anderen benutzen, sie geben nicht die gleichen Dinge zurück.

Wenn Sie die Browser-Funktionen zu filtern versuchen, könnte man sich wie in Marcel Korpel's answer wie folgt verwenden:

if(document.getElementById){ //DOM 
    element = document.getElementById(id); 
} else if (document.all) { //IE 
    element = document.all[id]; 
} else if (document.layers){ //Netscape < 6 
    element = document.layers[id]; 
} 


aber funktionell, document.getElementsByTagName('*') ist äquivalent zu document.all.

Zum Beispiel, wenn Sie wollten eigentlich document.all verwenden, um alle Elemente auf einer Seite zu untersuchen, wie folgt aus:

var k = document.getElementsByTagName("*"); 
var j = k.length; 
for (var i = 0; i < j; i++){ 
    alert("Page element["+i+"] has tagName:"+k[i].tagName); 
} 
+1

Ich verstehe nicht, wie die document.all (i) Notation funktioniert. Sollte es nicht Dokument sein? – DSoa

+1

@DSoa - Nach ein paar Recherchen bin ich mir nicht ganz sicher, ob das richtig ist oder ob beides funktionieren würde. [Diese Seite] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/documentall.htm) benutzt ** '[i]' ** wie ** 'document.all [4] .name' ** und [diese Seite] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/Listallelementsbyreferencethedocumentall.htm) verwendet ** '(i)' ** wie ** 'document.all (i) .tagName' **. –

2
:

var j = document.all.length; 
for(var i = 0; i < j; i++){ 
    alert("Page element["+i+"] has tagName:"+document.all(i).tagName); 
} 

Sie document.getElementsByTagName('*') stattdessen verwenden würde

Speziell wurde document.all für IE4 vor document.getElementById eingeführt.

die Anwesenheit von document.all bedeutet also, dass der Code soll IE4 unterstützen, oder versucht, den Browser als IE4 zu identifizieren (obwohl es Opera hätte sein können), oder die Person, die schrieb (oder kopiert und eingefügt) Der Code war nicht auf dem neuesten Stand. In dem höchst unwahrscheinlichen Fall, dass Sie IE4 unterstützen müssen, benötigen Sie document.all (oder eine Bibliothek, die diese uralten IE-Spezifikationen behandelt).

Verwandte Themen