Comme mentionné dans la réponse précédente, ce comportement est connu sous le nom de accès nommé sur l'objet fenêtre . La valeur de la name
pour certains éléments et la valeur de l'attribut id
pour tous les éléments sont disponibles en tant que propriétés de l'attribut global window
objet. Ces éléments sont connus sous le nom d'éléments nommés. Puisque window
est l'objet global dans le navigateur, chaque élément nommé sera accessible comme une variable globale.
Cette fonction a été ajoutée à l'origine par Internet Explorer et a finalement été mise en œuvre par tous les autres navigateurs, simplement pour des raisons de compatibilité avec les sites qui dépendent de ce comportement. Il est intéressant de noter que Gecko (le moteur de rendu de Firefox) a choisi d'implémenter cette fonctionnalité dans le navigateur suivant mode bizarrerie uniquement, alors que d'autres moteurs de rendu le laissent actif en mode standard.
Cependant, à partir de Firefox 14, Firefox prend désormais en charge l'accès nommé sur le window
en mode standard également. Pourquoi ont-ils changé cela ? Il s'avère qu'il y a encore beaucoup de sites qui dépendent de cette fonctionnalité en mode standard. Microsoft a même a publié une démo marketing qui l'a fait, empêchant la démo de fonctionner dans Firefox.
Webkit a récemment a considéré le contraire en reléguant l'accès nommé sur le window
l'objet en mode bizarrerie uniquement. Ils ont décidé de ne pas le faire pour le même raisonnement que Gecko.
Donc aussi fou que cela puisse paraître ce comportement est maintenant techniquement sûr à utiliser dans la dernière version de tous les principaux navigateurs en mode standard. . Mais si l'accès nominatif 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 qui ont motivé la décision de la Commission. les variables globales sont mauvaises . En d'autres termes, la présence d'un grand nombre de variables globales supplémentaires entraîne davantage de bogues. Imaginons que vous tapez accidentellement le nom d'une variable de type var
et que vous tapez par hasard un id
d'un nœud DOM, SURPRISE !
En outre, malgré la normalisation, il existe encore un certain nombre de divergences dans les implémentations de l'accès nommé dans les navigateurs.
- IE rend incorrectement la valeur de l'élément
name
accessible pour les éléments de formulaire (input, select, etc).
- Gecko et Webkit ne font PAS, de manière incorrecte, de
<a>
accessibles via leur name
attribut.
- Gecko ne traite pas correctement plusieurs éléments nommés portant 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 en a d'autres si vous essayez d'utiliser l'accès nommé sur des cas limites.
Comme mentionné dans d'autres réponses, utilisez document.getElementById
pour obtenir une référence à un nœud du DOM par son id
. Si vous avez besoin d'obtenir une référence à un noeud par son name
utilisation des attributs document.querySelectorAll
.
S'il vous plaît, ne propagez pas ce problème en utilisant un accès nommé dans votre site. Tant de développeurs web ont perdu du temps à essayer de retrouver ce problème. magique comportement. Nous devons vraiment agir et faire en sorte que les moteurs de rendu désactivent l'accès nommé en mode standard. À court terme, cela mettra fin aux activités de certains sites qui font de mauvaises choses, mais à long terme, cela contribuera à faire avancer le web.
Si cela vous intéresse, j'en parle plus en détail sur mon blog. https://www.tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .
10 votes
Voir aussi Pourquoi n'utilisons-nous pas simplement les ID des éléments comme identifiants en JavaScript ? sur les raisons pour lesquelles il ne faut pas l'utiliser, et Existe-t-il une spécification pour que l'identifiant des éléments devienne une variable globale ? sur la façon dont il est spécifié.
3 votes
@Bergi, le commentaire qui indique de ne pas faire cela est maintenant dépassé et même invalide. Par conséquent, je ne trouve pas de raison concrète de ne pas utiliser cette fonctionnalité.
2 votes
@EdmundReed Vous devriez relire la réponse à la question liée - c'est toujours une mauvaise idée : " variables globales implicitement déclarées "ont un support d'outillage faible ou inexistant et " conduire à un code fragile ". N'appelez pas cela une "fonctionnalité", la réponse ci-dessous explique qu'il s'agit simplement d'un bogue qui a été intégré à la norme pour des raisons de compatibilité.
2 votes
@Bergi juste assez, vous avez raison. Je pense toujours qu'il s'agit d'une fonctionnalité très intéressante, qui n'est considérée comme problématique que parce que les gens n'en sont pas conscients. Voici comment j'envisage de l'utiliser : codepen.io/esr360/pen/WEavGE?editors=1000#0
1 votes
@EdmundReed C'est moins problématique si vous ne séparez pas correctement le contenu et la logique bien sûr. Je recommande également de ne jamais utiliser de gestionnaires d'événements en ligne ou d'installer des méthodes personnalisées sur les éléments DOM en les utilisant de manière abusive comme espaces de noms (remarquez que ce n'est pas un "scope").