2010-03-09 15 views
43

¿Cuándo debe usar document.all contra document.getElementById?document.all vs. document.getElementById

+7

'document.all'? Hombre, * eso es * vieja escuela! –

+2

Old school? Revisé mis scripts y parece que usan ambas opciones para que los buscadores más antiguos sean atendidos. Así que eso no es en absoluto "vieja escuela", sino más bien una programación de sonido, que muestra que los fabricantes de navegadores que lo citan como un error son los codificadores más ignorantes y posiblemente inexpertos empleados por Google. – WilliamK

+1

Dato curioso: según una convención impía, 'typeof document.all === 'undefined'' – sam

Respuesta

50

document.all es una extensión de propiedad de Microsoft para el estándar W3C.

getElementById() es de uso estándar que.

Sin embargo, considere si usar una biblioteca js como jQuery sería útil. Por ejemplo, $("#id") es el equivalente de jQuery para getElementById(). Además, puede usar los selectores more than just CSS3.

32

document.all es muy anterior, usted don't have to use it anymore.

Para citar Nicholas Zakas:

Por ejemplo, cuando el DOM era joven, no todos los navegadores compatibles getElemenById(), y así que había un montón de código que se veía así:

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

Se ha eliminado el enlace roto a http://simonwillison.net/2003/Aug/11/documentAll/ –

5

document.all() es una forma no estándar de acceder a los elementos DOM. Ha quedado obsoleto desde algunos navegadores. Le da acceso a todos los elementos secundarios en su documento.

document.getElementById() es un estándar y totalmente compatible. Cada elemento tiene una identificación única en el documento.

Si usted tiene:

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

Usando

document.getElementById("testing"); 

tendrá acceso a la div específica.

2

Y document.all no será compatible con IE11 en!

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

+0

Interesante. Ahora que Chrome lo adoptó, esperaba que FF se uniera, pero si incluso MS lo deja, realmente se ha ido. Preferí document.all por su brevedad: document.all.editor es mucho mejor para escribir y leer que document.getElementById ("editor"). – citykid

3

document.querySelectorAll (y su variante document.querySelector() que devuelve el primer elemento que se encuentra) es mucho, mucho más potente. Usted puede fácilmente:

  • obtener una colección entera con document.querySelectorAll("*"), emulando efectivamente document.all propiedad no estándar;
  • usa document.querySelector("#your-id"), efectivamente emulando la función document.getElementById();
  • use document.querySelectorAll(".your-class"), efectivamente emulando la función document.getElementsByClassName();
  • use document.querySelectorAll("form") en lugar de document.forms y document.querySelectorAll("a") en lugar de document.links;
  • y realizar consultas de DOM mucho más complejas (utilizando cualquier selector de CSS disponible) que simplemente no se pueden cubrir con otros documentos incorporados.

Unified querying API es el camino a seguir. Incluso si document.all estuviera en la norma, es simplemente inconveniente.

12

En realidad, document.all sólo es mínimamente comparable a document.getElementById. No usarías uno en lugar del otro, no devolverían las mismas cosas.

Si estuviera tratando de filtrar a través de capacidades de navegador que usted podría utilizarlos como en Marcel Korpel's answer así:

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


Pero, funcionalmente, document.getElementsByTagName('*') es equivalente a más document.all.

Por ejemplo, si en realidad iban a utilizar document.all para examinar todos los elementos de una página, así:

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

que usaría document.getElementsByTagName('*') lugar:

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

No entiendo cómo funciona la notación document.all (i). ¿No debería ser document.all [i]? – DSoa

+1

@DSoa - Después de algunas investigaciones, no estoy del todo seguro de cuál es la correcta, o si de alguna manera, ambas funcionarían. [Esta página] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/documentall.htm) usa ** '[i]' ** como ** 'document.all [4] .name' ** , y [esta página] (http://www.java2s.com/Tutorial/JavaScript/0280__Document/Listallelementsbyreferencethedocumentall.htm) usa ** '(i)' ** como ** 'document.all (i) .tagName' **. –

2

Específicamente, document.all se introdujo para IE4 ANTES document.getElementById había sido introducido.

Por lo tanto, la presencia de document.all significa que el código está destinado para apoyar IE4, o está tratando de identificar el navegador como Internet Explorer 4 (aunque podría haber sido Opera), o la persona que escribió (o copiar y pegar) el código no estaba actualizado.

En el caso poco probable de que necesite soportar IE4, entonces, necesita document.all (o una biblioteca que maneje estas antiguas especificaciones de IE).

Cuestiones relacionadas