axel: href="#" wird im Opera interpretiert

good afternoon beisammen,

beim Rumprobieren, habe ich gerade etwas erstaunliches (für mich zumindest) festgestellt und möchte gerne erfahren, ob das auch andere Menschen überrascht.
Also: Für einen Link, der ein Javascript ausführen soll, wird oft folgende Lösung angeboten (auch hier im Forum):
<a href="#" onClick="jsfunction()">link</a>
Während nun der IE und NC (meine zumindest - IE 5.0 und NC 4.7) erwartungsgemäß das href="#" ignorieren und nur jsfunction() ausgeführt wird, sieht Opera (bei mir 5.11) das anders. href="#" wird als Verweis auf die aktuelle Datei gesehen (kann ich auch durchaus nachvollziehen), was aber zur Folge hat, das erst das Script ausgeführt wird und dann die beim Aufruf aktuelle Datei neu geladen wird.
Hier ein Beispiel, das das besonders schön verdeutlicht:
<a href="#" onClick="history.back()">back</a>
Klickt man in Opera auf den Link, wird kurz die Vorgängerseite dargestellt (back() wird ausgeführt), aber sofort danach die aufrufende Seite neu geladen. Im IE und NC funktioniert das als ganz normaler Zurück-Link.
Offensichtlich sollte man also prinzipiell
<a href="javascript:jsfunction()">
verwenden.

Ein schönes Restwochenende wünscht Euch
axel

  1. Hallo Axel,

    nun gebt doch mal nicht Opera die Schuld für eure Fehler. Ich mag den Browser zwar überhaupt nicht, für Programmierfehler kann er ja wirklich nichts.

    Also: Für einen Link, der ein Javascript ausführen soll, wird oft folgende Lösung angeboten (auch hier im Forum):
    <a href="#" onClick="jsfunction()">link</a>

    Dieser Aufruf besagt nichts weiter als: Führe beim Klick die Funktion aus und dann den Verweis.

    Während nun der IE und NC (meine zumindest - IE 5.0 und NC 4.7) erwartungsgemäß das href="#" ignorieren und nur jsfunction()

    nein, die ignorieren den überhaupt nicht. Die handeln genauso wie Opera. Sie laden lediglich die Seite nicht neu. Ein Blick in die Adresszeile verrät dir auch bei diesem Browser, das er den Befehl ausgeführt hat.

    Hier ein Beispiel, das das besonders schön verdeutlicht:
    <a href="#" onClick="history.back()">back</a>
    Klickt man in Opera auf den Link, wird kurz die Vorgängerseite dargestellt (back() wird ausgeführt), aber sofort danach die aufrufende Seite neu geladen.

    Opera regiert hier völlig korrekt.

    Im IE und NC funktioniert das als ganz normaler Zurück-Link.

    Da ansich der obengenannter Aufruf Unsinn ist, erst zurück und dann wieder vor wirkt hier wohl eher diese internen Fehlerkorrekturen der Browser. Außerdem haben NN und IE da auch ein unterschiedliches Timingverhalten.

    Offensichtlich sollte man also prinzipiell
    <a href="javascript:jsfunction()">
    verwenden.

    nein, besser ist:

    <a href="#" onClick="history.back();return false;">back</a>
                                        ^^^^^^^^^^^^^^

    return false unterdrückt die Ausführung des Verweises. Und das kann sogar Opera.

    Ein schönes Restwochenende wünscht Euch

    ebenfalls

    Gruß

    Antje

    1. Hallo Antje,

      nun gebt

      pluralis majestatis? :-)

      doch mal nicht Opera die Schuld für eure Fehler.

      Hab ich doch gar nicht. Mein Ziel war darauf hinzuweisen, daß der Opera so reagiert (wo bitte hab ich geschrieben, daß das nicht in Ordnung ist?) und daß man das vielleicht beachten sollte. Sicher kannst Du einwenden, daß der Code eh Mist ist, wenn man es so wie von mir beschrieben macht. Tatsache ist doch aber, daß man es häufig so als Beispiel oder Lösung sieht.

      nein, die ignorieren den überhaupt nicht. Die handeln genauso wie Opera. Sie laden lediglich die Seite nicht neu.

      Ja aber gerade das Nicht-Neuladen der Seite ist doch ein erheblicher Unterschied. Wie kannst Du das als gleiches Handeln bezeichnen?

      Opera regiert hier völlig korrekt.

      Hab ich das bezweifelt (s.o.)?

      nein, besser ist:

      <a href="#" onClick="history.back();return false;">back</a>
                                          ^^^^^^^^^^^^^^

      return false unterdrückt die Ausführung des Verweises. Und das kann sogar Opera.

      Warum ist das besser? (Nimm's mir nicht übel, denn ich bin ja wirklich interessiert daran, möglichst brauchbaren Code zu erzeugen, aber wenn Du schreibst dies und jenes ist besser, dann wäre eine Begründung sehr hilfreich)

      Vielen Dank für Deine Antwort
      axel

      1. Moin!

        nein, die ignorieren den überhaupt nicht. Die handeln genauso wie Opera. Sie laden lediglich die Seite nicht neu.
        Ja aber gerade das Nicht-Neuladen der Seite ist doch ein erheblicher Unterschied. Wie kannst Du das als gleiches Handeln bezeichnen?

        Der Unterschied hat aber nichts mehr mit diesem JavaScript-Code zu tun.

        <a href="#" onClick="history.back();return false;">back</a>
                                            ^^^^^^^^^^^^^^
        return false unterdrückt die Ausführung des Verweises. Und das kann sogar Opera.
        Warum ist das besser?

        Hat Carsten doch bereits dargestellt.

        So long

  2. Hallo!

    Also: Für einen Link, der ein Javascript ausführen soll, wird oft folgende Lösung angeboten (auch hier im Forum):
    <a href="#" onClick="jsfunction()">link</a>
    Während nun der IE und NC (meine zumindest - IE 5.0 und NC 4.7) erwartungsgemäß das href="#" ignorieren und nur jsfunction() ausgeführt wird, sieht Opera (bei mir 5.11) das anders.

    Also afaik machen der ie und der nn das auch, denn das ist imho auch richtig. Wenn das href="#" ignoriert werden soll, sollte man noch ein return false einbauen:
    <a href="#" onClick="jsfunction();return false;">link</a>

    bye
    Steffen

  3. Hallo axel!

    Der Vorteil von <a href="#" onclick="...">  ist zunächst mal das es auch mit etwas schwierigen 4er Netsacpe Versionen funktionieren soll.

    Ausserdem kann man mit <a href="http://your.link.here" onclick="..."> Leuten die Javascript ausgeschaltet haben zumindest Basisfunktionalität bieten.

    Damit das dann _richtig_ geht muss der onClick Code nur sagen, dass der Link doch bitte nicht mehr ausgeführt werden soll:
     <a href="#" onclick="yourcode(); return false;">
    Dann sollte es auch mit Opera funktionieren.

    Gruss,
     Carsten

    1. Hi Carsten, Hi Community

      Damit das dann _richtig_ geht muss der onClick Code nur sagen, dass der Link doch bitte nicht mehr ausgeführt werden soll:
      <a href="#" onclick="yourcode(); return false;">

      Klasse! Die Frage, wie man bei Javascriptaufruf & Href in einem Link sauber
      mischen kann, wollte ich gerade posten.

      Allerdings noch zwo Fragen:

      1. Ich würde intuitiv bei 'return false' eine Fehlermeldung
      des Browsers erwarten (wie bei einem Exitcode)! Falsch gedacht, aber ...

      Sehe ich das richtig, liefert ne Function auf höchster Ebene 'false'
      zurück, dann wird generell die Weiterbearbeitung einer Aktion (nicht nur
      bei onClick) durch den Browser eingestellt? Ist das dokumentiertes Verhalten
      oder Erfahrungswert?

      Beispiel: <onload='return false'> und die Seite wird nicht aufgebaut?

      2. Verzichte ich auf 'return false', kann ich dann generell erwarten,
      daß erst das Javascript fertig ausgeführt, und dann das href ausgewertet
      wird?

      Recht spezielle Fragen, aber bevor ich testreihen starte frage ich lieber
      erst euch. :)

      Schönes Restwochenende
      Rolf

  4. Hi axel,

    <a href="#" onClick="jsfunction()">link</a>

    Warum nimmst Du nicht <a href="javascript:jsfunction();">link</a>?
    (Deine Variante hätte natürlich den Vorteil, daß eine Non-JS-Alternative leichter möglich ist.)

    Gruß,
    Stefan

  5. good afternoon beisammen,

    Moin!

    <a href="#" onClick="jsfunction()">link</a>

    Wie siehts mit href="?", href="&" und href="" aus?