2009-04-30 4 views
1

Je ne sais pas si c'est une chose bien connue ou quelque chose de nouveau dans n'importe quelle version de Firefox, mais elle s'est juste mise à jour aussi - mais dans les deux cas je ne sais pas comment google pour cette question, donc je vais devoir le demander ici.Doctype strict empêchant l'accès à la variable DOM dans FireFox

J'ai un DIV dans mon DOM que je suis en train 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 était à l'origine des problèmes dans Firefox effectivement conduit au navigateur étant dans un état étrange «cassé».

L'erreur que j'obtenais était 'btnTest n'est pas défini'. Je n'ai pas eu cette erreur dans Safari, Internet Explorer ou Chrome. J'ai supposé que j'avais des balises HTML incompatibles, ou des accolades javascript ou quelque chose d'autre manquant. Finalement, après avoir tout débrouillé, j'ai essayé de supprimer le DOCTYPE. Soudainement dans Firefox (v 3.0.10) il a commencé à renvoyer l'ID correct comme prévu.

Que se passe-t-il !!! ?? Le mode "strict" devrait sûrement me permettre d'accéder à des éléments nommés, et si non, alors pourquoi tous les autres navigateurs me le permettent.

Note: Je peux facilement contourner ce problème avec $ ('# btnTest') [0] .id, ce que je vais devoir faire maintenant jusqu'à ce que je puisse trouver une 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> 
+0

btnTest n'est pas une variable. C'est un identifiant d'un élément DOM. Je ne vois pas ce que vous essayez de faire. document.getElementById ("btnTest"). id est valide, mais inutile. Vous connaissez déjà l'identifiant. –

+0

c'était l'exemple le plus possible d'essayer de faire quelque chose avec un élément DOM. certainement inutile dans cet exemple, mais comme je l'ai dit, j'ai dû affiner le code pour déraciner le problème. Il peut y avoir des cas où je veux une chaîne 'compiler safe' de l'identifiant d'un élément connu dans lequel cas btnTest.id devrait être valide - au lieu de hardcoding "btnTest". Je pense qu'il y a un bug dans firefox 3.0.10. cette version du navigateur montre aussi un taux de conversion des ventes plus bas sur notre site. –

+0

Je suis d'accord avec Matthew. alerte (btnTest.id) suppose que vous avez une variable nommée btnTest avec une propriété nommée id, et n'accède en aucun cas au DOM. Les éléments avec des identifiants ne sont pas disponibles à partir du DOM avec une telle syntaxe. C'est à ça que sert la fonction getElementById(). – zombat

Répondre

2

Il n'y a rien dans aucune spécification du W3C qui dit les références d'objets devraient être mis en place dans le cadre de script global pour les éléments avec id attributs. Ceci est considéré comme polluant sans nécessité l'espace de noms global et peut entraîner in confusing errors. Firefox établit les références lors de l'exécution en mode quirks pour des raisons de compatibilité IE. Johnny Stenback explique dans le troisième commentaire sur the bug for adding this support pourquoi ce n'est pas pris en charge en mode standard:

Cette fonction n'affecte la norme code conforme que par exemple vérifie l'existence [sic] d'une mondiale variable pour le définir une seule fois. Avec ce changement, que « varible » [sic ] peut maintenant être une référence à un élément dans le document , et le code peut ne pas fonctionner la façon dont le développeur voulu.

C'est la raison pour laquelle nous avons décidé de faire ce problème uniquement.

+0

génial. merci de fournir une vraie réponse! –

Questions connexes