2010-03-09 14 views
43

Quando utilizzare document.all rispetto a document.getElementById?document.all vs. document.getElementById

+7

'document.all'? Uomo, * quella * vecchia scuola! –

+2

Vecchia scuola? Ho controllato i miei script e sembrano utilizzare entrambe le opzioni per soddisfare i browser più vecchi. Quindi non è affatto "vecchia scuola", ma è più simile alla programmazione del suono, a dimostrazione del fatto che i produttori di browser che citano questo come errore sono i codificatori più ignoranti e forse inesperti impiegati da Google. – WilliamK

+1

Fun fact: per convenzione empia, 'typeof document.all === 'undefined'' – sam

risposta

50

document.all è un'estensione Microsoft proprietaria dello standard W3C.

getElementById() è standard: utilizzare quello.

Tuttavia, considerare se utilizzare una libreria js come jQuery sarebbe utile. Ad esempio, $("#id") è l'equivalente jQuery per getElementById(). Inoltre, è possibile utilizzare i selettori more than just CSS3.

32

document.all è molto vecchio, è don't have to use it anymore.

Per citare Nicholas Zakas:

Per esempio, quando il DOM era giovane, non tutti i browser supportati getElementById(), e quindi c'era un sacco di codice che si presentava così:

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

Rimosso link non funzionante a http://simonwillison.net/2003/Aug/11/documentAll/ –

5

document.all() è un modo non standard di accesso elementi DOM. È stato deprecato da alcuni browser. Ti dà accesso a tutti gli elementi secondari del tuo documento.

document.getElementById() è uno standard e completamente supportato. Ogni elemento ha un ID univoco nel documento.

Se si dispone di:

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

Utilizzando

document.getElementById("testing"); 

avranno accesso a quella specifica div.

2

E document.all non sarà supportato da IE11 on!

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

+0

Interessante. Ora che Chrome l'ha adottato, speravo che FF si unisse, ma se anche MS lo lascia, è davvero andato. Ho preferito document.all per la sua brevità: document.all.editor è molto più bello da scrivere e leggere di document.getElementById ("editor"). – citykid

3

document.querySelectorAll (e la sua document.querySelector() variante che restituisce il primo elemento trovato) è molto, molto più potente. Si può facilmente:

  • ottenere un'intera collezione con document.querySelectorAll("*"), emulando in modo efficace non standard document.all proprietà;
  • utilizzare document.querySelector("#your-id"), emulazione efficace della funzione document.getElementById();
  • utilizzare document.querySelectorAll(".your-class"), emulazione efficace della funzione document.getElementsByClassName();
  • utilizzare document.querySelectorAll("form") anziché document.forms e document.querySelectorAll("a") anziché document.links;
  • ed esegui query DOM molto più complesse (utilizzando qualsiasi selettore CSS disponibile) che non possono essere coperte con altri buildin di documenti.

Unified interrogazione API è la strada da percorrere. Anche se lo standard document.all fosse nello standard, è solo scomodo.

12

realtà, document.all è solo minimamente paragonabile a document.getElementById. Non ne useresti uno al posto dell'altro, non restituiscono le stesse cose.

Se si stava tentando di filtrare attraverso le funzionalità del browser di loro si potrebbe utilizzare come in Marcel Korpel's answer come questo:

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]; 
} 


Ma, funzionalmente, document.getElementsByTagName('*') è più equivalente a document.all.

Ad esempio, se si dovesse effettivamente intenzione di utilizzare document.all per esaminare tutti gli elementi di una pagina, in questo modo:

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

usereste document.getElementsByTagName('*') invece:

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

Non capisco come funziona la notazione document.all (i). Non dovrebbe essere document.all [i]? – DSoa

+1

@DSoa - Dopo alcune ricerche, non sono del tutto sicuro di quale sia corretto, o se in qualche modo, entrambi funzionerebbero. [Questa pagina] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/documentall.htm) usa ** '[i]' ** come ** 'document.all [4] .name' ** e [questa pagina] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/Listallelementsbyreferencethedocumentall.htm) usa ** '(i)' ** come ** 'document.all (i) .tagName' **. –

2

In particolare, è stato introdotto document.all per IE4 PRIMA che sia stato introdotto document.getElementById.

Quindi, la presenza di document.all significa che il codice è destinato per supportare IE4, o sta cercando di identificare il browser come Internet Explorer 4 (anche se avrebbe potuto essere Opera), o la persona che ha scritto (o copiato e incollato) il codice non era aggiornato al più tardi.

Nell'evento altamente improbabile che è necessario supportare IE4, quindi, è necessario document.all (o una libreria che gestisce queste antiche specifiche IE).

Problemi correlati