2009-01-12 4 views
5

Ich habe die folgende Codezeile in einem Link auf meiner Webseite:Warum schlägt der Aufruf dieser JQuery-Funktion in Firefox fehl?

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

Dies erzeugt einen Link, der offen eine versteckte Form Pop soll. Es funktioniert auf Safari, aber in Firefox, bekomme ich nur eine fast leere Seite mit nichts als den folgenden Text:

[object Object] 

Ich bin sicher, dass dies etwas mit dem Wert, der durch die JQuery-Funktion zurückgegeben zu tun hat, aber Ich bin mir nicht sicher, wie ich den Aufruf der JavaScript-Funktion beheben soll, damit er auch in Firefox funktioniert.

Antwort

21

Für die Liebe ...

<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> 

Bitte, JavaScript nicht einbetten, wie Sie in der HTML gerade getan.

Wenn Sie JavaScript in HTML wie das Einbetten Sie:

  1. unordentlich Code machen.
  2. Haben Sie seltsame Probleme wie Sie gerade mit Hacks, um es zu umgehen
  3. Benutzer versuchen, klicken Sie auf Links Links werden nirgendwo gesendet werden.
  4. Das Beibehalten des ausführbaren Teils Ihres Codes, der in Seitenverknüpfungen eingefügt wird, wird fehlschlagen.
  5. Sie degradieren nicht ordnungsgemäß, wenn Benutzer Javascript nicht
  6. problematisch werden, wenn Sie Dinge zu tun beginnen, um wie Speicher mehr als 2 Schichten tief zitiert.
+0

Ein Grund, es nicht so zu machen, wäre hilfreich. – mipadi

+0

Mehr debuggbar, sicherlich, aber manchmal darauf beharrend, kann der Einfachheit im Wege stehen. – tvanfosson

+0

Der gleiche Grund, warum Sie CSS auf der Seite nicht inline. Darüber hinaus ist es mit allen Browsern kompatibel und auf lange Sicht einfacher zu warten. – jacobangel

4

Versuchen:

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

Containing das Skript in einem void() wird der Browser die Anzeige des Ergebnisses der Ausführung unterdrücken.


aktualisieren

antwortete ich direkt auf die ursprüngliche Frage, mit der Lösung, die den geringsten Aufwand nehmen würde. Wie es in einigen anderen Antworten hier erwähnt wird, würde ich persönlich mein Markup und JavaScript getrennt halten und dynamisch einen onclick Handler hinzufügen, anstatt das Skript in das href Attribut einzubetten.

+1

-1: Diese Methode ist ziemlich veraltet. Es ist nicht gut für die Zugänglichkeit. – Greg

+0

Ich schätze die Antwort. Es hat gut geklappt, aber ich akzeptiere das weiter oben. – mipadi

2

Haben Sie versucht zu bewegen, was in href zu onclick ist? Im Allgemeinen sollten Sie Javascript im href-Attribut vermeiden.

+0

Einverstanden; Wenn Sie unbedingt JavaScript in den a-Tags selbst haben müssen (in der Regel eine schlechte Idee), dann setzen Sie es zumindest in das onclick-Attribut.Ein besserer Weg wäre wahrscheinlich, das click -Ereignis an die Links mit jQuery in einem separaten Skript-Tag/einer Datei zu binden. –

+0

Das ist richtig. Ich habe einfach angenommen, dass das OP einen guten Grund hatte, es einzubinden. –

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

Auch wenn Sie brauchen etwas auf dem Server zu tun, so dass, wenn Sie die Standardeinstellung einen Verweis auf das comment_form Element erhalten über eine Anfrage ist für sie sichtbar zu sein. Dies ermöglicht (diesen Teil von) Ihre Seite ohne Javascript aktiviert zu arbeiten.

+0

Das URL-Fragment (#comment_form) wird normalerweise nicht an den Server gesendet – Greg

+0

Richtig - Sie müssten die gesamte URL haben. Ich werde das reparieren. – tvanfosson