variable tag simo page manager guide gtm google and ahava javascript html dom global-variables identifier

javascript - tag - ¿Existe una especificación de que la identificación de los elementos se debe convertir en variable global?



page path and page url (5)

Si tengo un <div id=''a''> en Chrome, entonces en javascript puedo hacer a. stuff() a. stuff() (es como si a es una variable global).

Sin embargo, esto no funciona con FireFox. Tendré que usar document.getElementById(''a'') .

¿Cuál es el comportamiento correcto aquí? (de acuerdo con las especificaciones W3 que es)

También me interesa saber cómo resolverá Chrome la ambigüedad si tengo un div con id a a aún tengo una variable global llamada también en mi script. ¿El comportamiento será aleatorio y loco?

¿Y cómo se traduciría un elemento con id que consta de guiones ("-"), dos puntos (":") y puntos (".")? De acuerdo, sé que se puede acceder con document.getElementById pero ¿cómo se traducirá el navegador? en la variable global que los representaba)


Creo que document.getElementById es compatible con la mayoría de los navegadores hasta ahora ... Es mejor y más seguro usar este ...


Depende de qué especificación lea. :)

Este comportamiento no se describe en la especificación HTML4 (cf, http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-id y http://www.w3.org/TR/1999/REC-html401-19991224/types.html#type-name ). Sin embargo, fue introducido por Internet Explorer y luego fue copiado en otros navegadores principales por compatibilidad. FireFox también muestra este comportamiento, pero solo en el modo peculiar (e incluso entonces su implementación parece fallar).

La especificación WHATWG HTML actualmente requires este comportamiento, pero hay un error abierto que solicita que se elimine.

Independientemente del cumplimiento de la especificación, el uso del espacio de nombre global (es decir, la window ) para el código de la aplicación generalmente se considera un mal comportamiento. Considere hacer referencia a los identificadores de elementos utilizando los métodos de conveniencia document.getElementById() o jQuery (por ejemplo, $("#a") ) y utilizando variables con ámbito de función para evitar introducir nuevas variables en el espacio de nombres global.

Hay una discusión más larga de este comportamiento en la lista de correo de WHATWG .


Desde muy temprano, IE ha creado variables globales que hacen referencia a elementos por su nombre o valor de atributo de id. Esto nunca fue una buena idea, pero fue copiado por otros navegadores para ser compatible con sitios creados para IE.

Es una mala idea y no debe copiarse ni usarse.

Editar

Para responder a sus preguntas adicionales:

... cómo resolverá Chrome la ambigüedad si tengo un div con id a pero tengo una variable global llamada también en mi script.

En IE (que introdujo este comportamiento) si una variable global se declara con el mismo nombre que un identificador o nombre de elemento, tomará presidencia. Sin embargo, los globales no declarados no funcionan de esa manera. No se necesita mucho para probar eso en Chrome (tengo pero no voy a darte la respuesta).

¿Y cómo se traduciría un elemento con id que consta de guiones ("-"), dos puntos (":") y puntos (".")? De acuerdo, sé que se puede acceder con document.getElementById, pero ¿cómo se traducirá el navegador? en la variable global que los representaba)

Exactamente igual que cualquier nombre de propiedad de objeto que no sea un identificador válido: notación de corchetes (es decir, ventana [''nombre-o-id'']).


Lo peor del uso de elementos de esta manera es que podrían romperse en cualquier momento si se introduce una nueva API con el mismo nombre en el ámbito global.

Por ejemplo, si tenía esto antes de agregar la API de rendimiento

<p id="performance"></p> <script> performance.innerHTML = "You''re doing great" </script>

Entonces, esa pieza de código habría dejado de funcionar ahora en navegadores recientes que implementaron la API de rendimiento cuando se agregó un objeto de performance global.


Técnicamente, esta pregunta es opinión, pero es una buena pregunta.

IE hace esto también y ha causado dolores de cabeza para algunos.

Las reglas para nombrar variables en JavaScript y las ID en HTML son diferentes. No puedo ver cómo esto es algo bueno.

Por ejemplo, en esta página hay un elemento con una ID de "notify-container". Ese no es un nombre de JavaScript válido en absoluto.

Además, ¿cuándo están vinculados estos nombres? Si un script en línea declara una variable y luego el elemento aparece más tarde, ¿cuál tiene prioridad?

No se puede hacer consistente.