Safari: document.write, onclick und Links „zu“ javascript:
Robert Bienert
- 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
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
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
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
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
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/)
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
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.