Robert Bienert: Safari: document.write, onclick und Links „zu“ javascript:

Moin!

Ich schreibe (immer noch) an meinem Artikel über Bookmarklets. Als Anwendungsbeispiel habe ich mir einen Cookie-Editor ausgedacht, in dessen Code sowohl eine for-Schleife als auch Aufrufe der Methode document.write enthalten sind. Der einzige Browser, der mit meinem Code Probleme hat, ist Apples Safari. Meine Nachforschungen mit deutlich vereinfachten Code-Schnipseln führten mich zu der Annahme, dass der Safari document.write-Aufrufe in onclick-Handlern und javascript-Links nicht mag. Getestet habe ich dies mit folgendem Code:

<script type="text/javascript">  
<!--  
[code lang=javascript]function p() {  
    var j = 0;  
  
    for (; j < 5; ++j)  
        document.write(''+j);  
}  
//
~~~-->  
</script>  
<p><code>document.write</code> über  
<ul>  
    <li><a href="javascript:`p()`{:.language-javascript}">javascript:</a></li>  
    <li><a onclick="`document.write('hallo')`{:.language-javascript}">onclick</a></li>  
</ul>[/code]  
  
Woran könnte es liegen, dass Safari document.write in diesen Fällen nicht mag? Könnte jemand überprüfen, was der Konquerer aus diesem Beispiel macht?  
  
Viele Grüße,  
Robert
  1. Hallo Robert.

    Könnte jemand überprüfen, was der Konquerer aus diesem Beispiel macht?

    Er ersetzt das aktuelle Dokument durch „01234“ bei „javascript:“ und durch „hallo“ beim zweiten.

    Opera 9TP2 macht dies übrigens nicht.
    Die Ausgabe von document.documentElement.innerHTML:

    <HTML><BODY>01234</BODY></HTML>

    Und:

    <HTML><BODY>hallo</BODY></HTML>

    Angezeigt wird aber rein garnichts. Ich schätze aber, dass dies lediglich ein Bug der TP ist. (Zumindest kann ich mich nicht erinnern, in vorherigen Versionen auf eine solche Unregelmäßigkeit gestoßen zu sein.)

    Einen schönen Mittwoch noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hallo Ashura

      Könnte jemand überprüfen, was der Konquerer aus diesem Beispiel macht?

      Er ersetzt das aktuelle Dokument durch „01234“ bei „javascript:“ und durch „hallo“ beim zweiten.

      OK, dann scheint diese Merkwürdigkeit im Safari-Code zu stecken, nicht in KHTML bzw. KJS.

      Die Ausgabe von document.documentElement.innerHTML:

      … ist beim Safari rein gar nichts.

      Vielen Dank und viele Grüße,
      Robert

  2. hi,

    Der einzige Browser, der mit meinem Code Probleme hat, ist Apples Safari. Meine Nachforschungen mit deutlich vereinfachten Code-Schnipseln führten mich zu der Annahme, dass der Safari document.write-Aufrufe in onclick-Handlern und javascript-Links nicht mag.

    Hilft es, wenn du wie bei document.open() beschrieben vorgehst?

    "open()
    Öffnet ein Dokument zum Schreiben. Dabei wird kein Fenster geöffnet, sondern der Fensterinhalt zum Neubeschreiben freigegeben. Falls das Dokument vorher einen Inhalt hatte, zum Beispiel eine zunächst geladene HTML-Datei, sollten Sie zuerst die close()-Methode aufrufen."

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Moin!

      Hilft es, wenn du wie bei document.open() beschrieben vorgehst?

      In der Tat war das genau die richtige Idee, vielen Dank! Von document.open() hatte ich vorher noch nie etwas gehört, ich dachte immer, dass document.write() ausreicht. Mein nun funktionierender Beispiel-Code sieht jetzt so aus:

      <script type="text/javascript">  
      <!--  
      [code lang=javascript]function p() {  
          var j = 0;  
        
          document.open();  
        
          for (; j < 5; ++j)  
              document.write(''+j);  
        
          document.close();  
      }  
      //
      ~~~-->  
      </script>  
      <p><code>document.write</code> über  
      <ul>  
          <li><a href="javascript:`p()`{:.language-javascript}">javascript:</a></li>  
          <li><a onclick="`with(document){open();write('hallo');close();}`{:.language-javascript}">onclick</a></li>  
      </ul>[/code]  
        
      Dann hoffe ich, dass das wirklich das Problem des Safari mit meinem Bookmarklet war.  
        
      Viele Grüße,  
      Robert
      
  3. function p() {

    var j = 0;

    for (; j < 5; ++j)
            document.write(''+j);

    Mal abgesehen davon dass du hier das dokument überschreibst und nicht schliesst.

    <li><a href="javascript:[code lang=javascript]p()

    
    >     <li><a onclick="`document.write('hallo')`{:.language-javascript}">onclick</a></li>  
    > </ul>[/code]  
      
    Hast du mal geprüft ob der onclick Event überhaupt ausgeführt wird, da fehlt IMHO, damit es ein anklickbarer Link ist, noch das href Attribut.  
      
    Struppi.
    
    -- 
    [Javascript ist toll](http://javascript.jstruebig.de/)
    
    1. Moin!

      Mal abgesehen davon dass du hier das dokument überschreibst und nicht schliesst.

      Für meinen Zweck will ich das Dokument ja auch überschreiben. Auf das Schließen – bedingt das nicht ein vorheriges Öffnen? – bezieht sich auch wahsagas Antwort.

      <a onclick="[code lang=javascript]document.write('hallo')">onclick</a>[/code]

      Hast du mal geprüft ob der onclick Event überhaupt ausgeführt wird, da fehlt IMHO, damit es ein anklickbarer Link ist, noch das href Attribut.

      Sollte onclick nicht bei jedem HTML-Element funktionieren? Sowohl Firefox als auch Mac-IE akzeptieren und führen diesen Code aus. Mit dem richtigen Ansatz macht dies sogar der Safari.

      Viele Grüße,
      Robert

      1. Für meinen Zweck will ich das Dokument ja auch überschreiben. Auf das Schließen – bedingt das nicht ein vorheriges Öffnen? – bezieht sich auch wahsagas Antwort.

        Eine document.write() ohne vorheriges document.open() ja. Aber wie du muisst dann immer ein document.close(); hinten dran setzen. Also das document.open() ist in deinem Falle nicht wichtig oder nötig, das document.close() muss aber, wenn nichts mehr eiter gechrieben wird auf jeden Fall aufgerufen werden, da manche Browser dann das dokument nicht anzeigen (z.b. schon NC 4 nicht)

        Sollte onclick nicht bei jedem HTML-Element funktionieren? Sowohl Firefox als auch Mac-IE akzeptieren und führen diesen Code aus.

        Stimmt sollte.

        Struppi.