2009-01-12 5 views
5

J'ai la ligne de code suivante dans un lien sur ma page Web:Pourquoi l'appel de cette fonction JQuery échoue-t-il dans Firefox?

<a href="javascript:$('#comment_form').toggle('normal')" title="Comment on this post"> 

Cela produit un lien qui devrait apparaître une forme cachée ouverte. Il fonctionne sur Safari, mais dans Firefox, je reçois juste une page presque vide avec rien d'autre que le texte suivant:

[object Object] 

Je suis sûr que cela a quelque chose à voir avec la valeur retournée par la fonction JQuery, mais Je ne suis pas sûr de savoir comment résoudre l'appel à la fonction JavaScript afin qu'il fonctionne également dans Firefox.

Répondre

21

Pour l'amour de ...

<script type='text/javascript'> 
jQuery(function($){ # Document ready, access $ as jQuery in this scope 
    $("a#comment").click(function(){ # bind a click event on the A like with ID='comment' 
     $('#comment_form').toggleClass('normal'); # Toggle the class on the ID comment form 
     return false; # stop the href from being followed. 
    }); 
}); 
</script> 
.... 
<a id="comment" href="/you_need_javascript_sorry.html" title="Comment on this post"> 
    [Comment] 
</a> 

S'il vous plaît, ne l'avez pas intégré JavaScript comme vous venez dans le code HTML.

Si vous incorporez JavaScript HTML comme ça, vous:

  1. rendre le code désordre.
  2. Avoir des problèmes étranges comme vous venez de le faire avec des hacks pour le contourner
  3. Les utilisateurs essayant de cliquer sur les liens du milieu ne seront envoyés nulle part.
  4. La maintenance de la partie exécutable de votre code intercalée dans les liens de page se terminera par un échec.
  5. Ne pas dégrader avec élégance lorsque les utilisateurs n'ont pas javascript
  6. Devenez problématique lorsque vous commencez à avoir besoin de faire des choses comme des citations de magasin de plus de 2 couches de profondeur.
+0

Une raison de ne pas le faire de cette façon serait utile. – mipadi

+0

Plus débuggable, certes, mais insister parfois sur ce point peut nuire à la simplicité. – tvanfosson

+0

La même raison pour laquelle vous n'inscrivez pas de CSS sur la page. De plus, il est compatible avec tous les navigateurs et plus facile à maintenir à long terme. – jacobangel

4

Essayez:

<a href="javascript:void($('#comment_form').toggle('normal'))" title="Comment on this post"> 

contenant le script dans un void() supprimera le navigateur d'afficher le résultat de l'exécution.


Mise à jour

je répondu directement à la question initiale, avec la solution qui prendrait le moins d'effort. Comme cela est mentionné dans d'autres réponses ici, personnellement, je garderais mon balisage et JavaScript séparés et j'ajouterais dynamiquement un gestionnaire onclick au lieu d'incorporer le script dans l'attribut href.

+1

-1: cette méthode est assez obsolète. Ce n'est pas bon pour l'accessibilité. – Greg

+0

J'apprécie la réponse. Cela a bien fonctionné, mais je vais accepter le plus en profondeur ci-dessus. – mipadi

2

Avez-vous essayé de déplacer ce qui est dans href sur onclick? En général, vous devriez éviter javascript dans l'attribut href.

+0

D'accord; Si vous devez absolument avoir javascript dans les tags a eux-mêmes (généralement une mauvaise idée en soi), mettez-le au moins dans l'attribut onclick.Un meilleur moyen serait probablement de lier l'événement click aux liens avec jQuery dans un tag/fichier de script séparé. –

+0

C'est exact. J'ai juste supposé que le PO avait une bonne raison de l'inclure. –

0
<a href="http://full-url-to-directory/page#comment_form" 
    onclick="$('#comment_form').toggle('normal');return false;" 
    title="Comment on this post"> 

Bien que vous aurez besoin de faire quelque chose sur le serveur de sorte que lorsque vous obtenez une référence à l'élément de comment_form via une requête par défaut est pour qu'il soit visible. Cela permettra à (cette partie de) votre page de fonctionner sans JavaScript activé.

+0

Le fragment d'URL (#comment_form) n'est généralement pas envoyé au serveur. – Greg

+0

Correct - vous devez avoir l'URL complète. Je vais réparer ça. – tvanfosson

Questions connexes