Comme mentionné dans la réponse précédente, ce comportement est appelé accès nommé sur l'objet fenêtre . La valeur de l' nameattribut pour certains éléments et la valeur de l' idattribut pour tous les éléments sont mises à disposition en tant que propriétés de l' windowobjet global . Ce sont des éléments nommés. Puisque windowc'est l'objet global dans le navigateur, chaque élément nommé sera accessible en tant que variable globale.
Cela a été ajouté à l'origine par Internet Explorer et a finalement été implémenté par tous les autres navigateurs simplement pour la compatibilité avec les sites qui dépendent de ce comportement. Fait intéressant, Gecko (le moteur de rendu de Firefox) a choisi de l'implémenter en mode excentrique uniquement, tandis que d'autres moteurs de rendu l'ont laissé en mode standard.
Cependant, à partir de Firefox 14, Firefox prend désormais en charge l'accès nommé sur l' windowobjet en mode standard également. Pourquoi ont-ils changé cela? Il s'avère qu'il y a encore beaucoup de sites qui s'appuient sur cette fonctionnalité en mode standard. Microsoft a même publié une démo marketing qui l'a empêché de fonctionner dans Firefox.
Webkit a récemment considéré le contraire , reléguant l'accès nommé sur l' windowobjet au mode excentrique uniquement. Ils ont décidé contre cela par le même raisonnement que Gecko.
Donc… fou comme il semble que ce comportement est désormais techniquement sûr à utiliser dans la dernière version de tous les principaux navigateurs en mode standard . Mais si l'accès nommé peut sembler quelque peu pratique, il ne doit pas être utilisé .
Pourquoi? Une grande partie du raisonnement peut être résumée dans cet article sur les raisons pour lesquelles les variables globales sont mauvaises . Autrement dit, avoir un tas de variables globales supplémentaires conduit à plus de bugs. Disons que vous tapez accidentellement le nom d'un varet qu'il vous arrive de taper un idd'un nœud DOM, SURPRISE!
De plus, bien qu'il soit standardisé, il existe encore quelques différences dans les implémentations d'accès nommé du navigateur.
- IE rend incorrectement la valeur de l'
nameattribut accessible pour les éléments de formulaire (entrée, sélection, etc.).
- Gecko et Webkit ne rendent pas les
<a>balises accessibles via leur nameattribut de manière incorrecte .
- Gecko ne gère pas correctement plusieurs éléments nommés avec le même nom (il renvoie une référence à un seul nœud au lieu d'un tableau de références).
Et je suis sûr qu'il y a plus si vous essayez d'utiliser l'accès nommé sur les cas marginaux.
Comme mentionné dans d'autres réponses, utilisez document.getElementByIdpour obtenir une référence à un nœud DOM par son id. Si vous devez obtenir une référence à un nœud par son nameattribut, utilisez document.querySelectorAll.
Veuillez ne pas propager ce problème en utilisant l'accès nommé dans votre site. Tant de développeurs Web ont perdu du temps à essayer de retrouver ce comportement magique . Nous devons vraiment agir et obtenir des moteurs de rendu pour désactiver l'accès nommé en mode standard. À court terme, certains sites feront de mauvaises choses, mais à long terme, cela aidera à faire avancer le Web.
Si vous êtes intéressé, j'en parle plus en détail sur mon blog - https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .