2011-02-18 14 views
8

al crear páginas web que tienen una función¿Por qué existe la función document.getElementById()?

var someVariable = document.getElementById('myID'); 

siempre se utiliza para obtener una referencia a un objeto elemento. Hace poco me sugirieron que esto no es necesario, porque ya existe tal variable. Su nombre es igual a la identificación. Lo probé y parece funcionar.

<div id="myID">some text</div> 
<a href="someplace" onclick="alert(myID.innerHTML)">click here</a> 

Este código funciona y alerta "algún texto" como se esperaba. Solo hay una advertencia en la consola de error de firefox:

elemento al que hace referencia ID/NAME en el alcance global. Utilice WC3 estándar document.getElementById() en su lugar ....

estoy usando jQuery sobre todo por ahora, pero tengo que probar un punto a mi jefe en el trabajo o de lo contrario voy a tener que comprarle una caja de chocolate :-).

¿Alguna idea de por qué el código superior no debería funcionar o por qué es una idea muy incorrecta usarlo (advertencia en Firefox no es suficiente) ???

Gracias por sus respuestas

+0

referencia directa funciona en IE y versiones 'recientes' de Firefox :) –

Respuesta

8

elemento referenciado por ID/NAME en ámbito global. Uso WC3 estándar document.getElementById() en su lugar ....

La llamada actual resultaría en una posible colisión variable.

Imagine lo siguiente:

<script> 
    var myID = 'foo'; 
</script> 
<div id="myID">some text</div> 
<a href="someplace" onclick="alert(myID.innerHTML)">click here</a> 

myID ahora no es el elemento HTML, pero una variable que contenga 'foo'. Example.

Siempre debe utilizar document.getElementById() porque está construido para la función específica para recuperar elementos HTML y JavaScript variables no.

+0

@Crowder Global vars también entran en el objeto' ventana'. – Aistina

+0

@Aistina: Perdón, leí tu respuesta de alguna manera. Por alguna razón, pensé que se trataba de un alcance interno en una función, pero a menos que hayas editado tu respuesta, claramente estás trabajando en un ámbito global. Lo siento por eso. –

10

¿Alguna idea de por qué el código superior no debería funcionar o por qué es una idea muy incorrecta usarlo (advertencia en firefox no es suficiente) ???

Porque no es estándar (but not for long). Aunque algunos navegadores asignan elementos con un ID a variables globales, no hay obligación para ellos de hacerlo (y no todos lo hacen). Las versiones anteriores de Firefox, por ejemplo, no muestran este comportamiento. También existe el riesgo de nombrar colisiones.

Usando document.getElementById() asegura que todos los navegadores se comportan exactamente el mismo (bueno, más o menos tos) al obtener un identificador de un elemento.

Consulte bobince's excellent answer a una pregunta similar para obtener más información.

+1

+1, hasta donde yo sé *, nunca se ha estandarizado, solo está bien respaldado. Pero por separado, hay valores de 'id' válidos que no puede usar a través de 'window.X', como el id" foo [bar] ". Ese es un valor HTML válido de 'id', pero mientras que algunos navegadores encontrarán el elemento si lo hace 'window [" foo [bar] "]', algunos navegadores (Firefox, por ejemplo) no lo harán: http://jsbin.com/otoso4/2 –

+0

@TJC, no, aún no se ha estandarizado, pero está en el borrador HTML5 (ver respuesta actualizada). Obviamente, el comité de supervisión vio que la mayoría de los navegadores se comportaron de esta manera y decidieron que todos deberían hacerlo. Una idea realmente estúpida, IMO (muy parecida a otras [monkey see, monkey do partes de la especificación] (http://whattheheadsaid.com/2010/12/scoping-with-html-and-inline-event-attributes)). –

1

Presumible para compatibilidad con varios navegadores. La segunda versión no funciona en Chrome. Lo que significa que probablemente también fallaría en Safari.

+0

Eso es extraño, la segunda versión funcionaba en Chrome cuando lo probé. –

+0

Lo probé en el inspector de webkit en esta misma página. Estoy ejecutando la versión de desarrollo así que puede ser por eso. – xzyfer

+0

Sí, funciona en las versiones actuales de todos los principales navegadores, AFAIK. Aunque no funcionará en versiones anteriores de Firefox. –

Cuestiones relacionadas