Doctype strict empêchant l'accès à une variable DOM dans FireFox
Question
Je ne sais pas s'il s'agit d'une "chose" bien connue ou d'une nouveauté, quelle que soit la version de Firefox, elle vient de se mettre à jour elle aussi - mais dans les deux cas, je ne sais pas du tout comment utiliser Google pour cette question. de le demander ici.
J'ai dans mon DOM une DIV à laquelle j'essaie d'accéder directement par identifiant, sous la forme la plus simple, comme ceci:
alert(btnTest.id);
Cela fonctionne très bien dans tous les navigateurs, mais causait des problèmes dans Firefox qui ont en fait conduit le navigateur à un état "cassé" étrange.
L'erreur que je recevais était "btnTest is not defin". Je n'ai pas eu cette erreur dans Safari, Internet Explorer ou Chrome.
J'ai supposé que les balises HTML, les accolades javascript ou d'autres éléments manquaient. Finalement, après avoir tout dépouillé, j'ai essayé de retirer le DOCTYPE. Soudainement dans Firefox (v 3.0.10), il a commencé à renvoyer l'ID correct comme prévu.
Qu'est-ce qui se passe !!! ?? Le mode «strict» devrait sûrement me permettre d’accéder aux éléments nommés. Sinon, pourquoi tous les autres navigateurs me le permettent-ils?
Remarque: je peux facilement contourner ce problème avec $ ('# btnTest') [0] .id, ce que je vais devoir faire maintenant jusqu'à ce que je puisse comprendre un meilleure solution.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="blueCircles">
<head>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
$(function() {
alert("ID retrieved through jQuery: " + $('#btnTest')[0].id);
alert("ID retrieved by accessing global variable: " + btnTest.id);
});
</script>
</head>
<body>
<div id="btnTest">
</div>
</body>
</html>
La solution
Aucune spécification du W3C ne dit que des références d'objet devraient être établies dans la portée de script globale pour les éléments dotés d'attributs id
. Ceci est considéré comme polluant de manière non nécessaire l'espace de noms global et peut entraîner une erreurs confuses .
Firefox établit les références lorsqu’il est exécuté en mode quirks aux fins de la compatibilité avec IE. Johnny Stenback explique dans le troisième commentaire sur le bogue pour l'ajout de cette assistance pourquoi n'est pas supporté en mode standard:
Cette fonctionnalité affecte les standards code conforme que par exemple vérifie l’existence [ sic ] d’un programme global variable pour le définir une seule fois. Avec ce changement, que "varible" [ sic ] peut maintenant être une référence à un élément de la document, et le code peut ne pas fonctionner la façon dont le développeur avait l'intention.
C'est la raison pour laquelle nous avons décidé de faire cette bizarreries seulement.