Raik: Bookmarklet funktioniert nur aus Html-Datei, nicht aus Favoriten

Hallo!

Folgendes Bookmarklet, läuft ohne Probleme im IE6, wenn ich es aus einer HTML-Datei heraus aufrufe:

<a href="javascript:FL='opener';source=document.getElementsByTagName('html')[0].outerHTML;eW=open('','','width=600,height=550,resizable');eW.focus();with(eW.document){write('<body style=margin:0 onresize=document.fM.tA.style.setAttribute('height',document.body.offsetHeight-30,'false')><form name=fM><textarea style=width:100%;height:524 name=tA wrap></textarea><input type=button value=Update onclick=with('+FL+'.document){write(document.fM.tA.value);close()}><input type=button value=Close onclick=self.close()>');fM.tA.value=source;void(close())}">Test-Link</a>

der Code nochmal etwas übersichtlicher als Funktion:

<a href="javascript:go()">Test-Funktion</a>
<script type="text/javascript">
function go(){
    FL='opener';
    source=document.getElementsByTagName('html')[0].outerHTML;
    eW=open('','','width=600,height=550,resizable');
    eW.focus();
    with(eW.document){
        write('<body style=margin:0 onresize=document.fM.tA.style.setAttribute('height',document.body.offsetHeight-30,'false')>');
        write('<form name=fM><textarea style=width:100%;height:524 name=tA wrap></textarea>');
        write('<input type=button value=Update onclick=with('+FL+'.document){write(document.fM.tA.value);close()}>');
        write('<input type=button value=Close onclick=self.close()>');
        fM.tA.value=source;
    void(close())
    }
}
</script>

Rufe ich das Bookmarklet allerdings aus meinen Favoriten heraus auf, passiert garnichts (kein neues Fenster, keine Fehlermeldungen). Erst, wenn ich aus dem onResize-Event im Body-Tag die Wertzuweisung für Height entferne (z.B. durch alert(document.body.offsetHeight-30) ersetze), funktioniert das Bookmarklet auch aus den Favoriten heraus.

Hat jemand eine Idee, woran das liegen könnte?

freundl. Grüsse aus Berlin, Raik

  1. Hallo!

    So, das Ganze nochmal als Link zum Angucken:
    http://mitglied.lycos.de/ed2kserver/Bookmarklet_IE.htm

    freundl. Grüsse, Raik

  2. Hi,

    Rufe ich das Bookmarklet allerdings aus meinen Favoriten heraus auf, passiert garnichts (kein neues Fenster, keine Fehlermeldungen). Erst, wenn ich aus dem onResize-Event im Body-Tag die Wertzuweisung für Height entferne (z.B. durch alert(document.body.offsetHeight-30) ersetze), funktioniert das Bookmarklet auch aus den Favoriten heraus.

    Hat jemand eine Idee, woran das liegen könnte?

    Wahrscheinlich ist es einfach zu lang. Im IE5 durften Bookmarklets noch etwas mehr als 2000 Byte haben, im 6er war dann aber viel eher Schluss (508 Byte?). Wenn du damit nicht hinkommst, kannst du ja immer noch ein neues Script-Element erzeugen und so eine lokale Script-Datei ins Dokument laden.

    Grüße, Stefan

    1. Hallo, Zapp!

      Du bist ein Genie!!! :-D
      Genau daran hat es  gelegen. Den self.close()-Button entfernt und es funktioniert! JUHUUUUUU
      "Ich habe fertig":

      javascript:FL="opener";source=document.getElementsByTagName("html")[0].outerHTML;eW=open("","","width=600,height=550,resizable");eW.focus();with(eW.document){write("<body style=margin:0 onresize=document.fM.tA.style.setAttribute('height',document.body.offsetHeight-30,'false')><form name=fM><textarea style=width:100%;height:524 name=tA wrap></textarea><input type=button value=Update onclick=with("+FL+".document){write(document.fM.tA.value);close()}>");fM.tA.value=source;void(close())}

      freundl. Grüsse aus Berlin, Raik

      1. Hi,

        Genau daran hat es  gelegen.

        Die Sache hatte mich damals auch einige graue Haare gekostet. Ein Byte zuviel und nichts geht mehr ist auch eine gemeine Sache, die man nicht so schnell durchschaut.

        javascript:FL="opener";source=document.getElementsByTagName("html")[0].outerHTML;eW=open("","","width=600,height=550,resizable");eW.focus();with(eW.document){write("<body style=margin:0 onresize=document.fM.tA.style.setAttribute('height',document.body.offsetHeight-30,'false')><form name=fM><textarea style=width:100%;height:524 name=tA wrap></textarea><input type=button value=Update onclick=with("+FL+".document){write(document.fM.tA.value);close()}>");fM.tA.value=source;void(close())}

        Nicht schlecht, so direkt im Code herumpfuschen zu können, das kann man sicher häufiger mal brauchen :-)

        Grüße, Stefan

        1. Hallo, Zapp!

          Nicht schlecht, so direkt im Code herumpfuschen zu können, das kann man sicher häufiger mal brauchen :-)

          javascript:S='document.documentElement.outerHTML';if(N=frames.length){N=prompt(N,'0');if(N>0){N='.frames['+(N-1)+'].';S='top'+N+S;}else N='.';}W=open('','','width=600,height=550,resizable');with(W.document){write('<body style=margin:0 onresize=document.F.A.style.height=document.body.offsetHeight-30><form name=F><textarea style=width:100%;height:524 name=A wrap></textarea><button onclick=with(opener'+N+'document){write(document.F.A.value);close()}>');F.A.value=eval(S);void(close())}

          488 Zeichen lang. Besser? ;-D

          freundl. Grüsse aus Berlin, Raik

          1. Hallo, Zapp!

            Nicht schlecht, so direkt im Code herumpfuschen zu können, das kann man sicher häufiger mal brauchen :-)

            javascript:S='document.documentElement.outerHTML';N='';(L=frames.length)?L=prompt(L,'0'):L='';if(L>0){N='frames['+(L-1)+'].';S='top.'+N+S;}W=open('','','width=600,height=550,resizable');with(W.document){write('<body style=margin:0 onresize=document.F.A.style.height=document.body.offsetHeight-30><form name=F><textarea style=width:100%;height:524 name=A wrap></textarea><button onclick=with(opener.'+N+'document){write(document.F.A.value);close()}>');F.A.value=eval(S);void(close())}

            War noch ein kleiner Bug drin, dafür jetzt nur noch 485 Zeichen. :-D

            freundl. Grüsse aus Berlin, Raik

          2. Hi,

            Nicht schlecht, so direkt im Code herumpfuschen zu können, das kann man sicher häufiger mal brauchen :-)

            javascript:S='document.documentElement.outerHTML';if(N=frames.length){N=prompt(N,'0');if(N>0){N='.frames['+(N-1)+'].';S='top'+N+S;}else N='.';}W=open('','','width=600,height=550,resizable');with(W.document){write('<body style=margin:0 onresize=document.F.A.style.height=document.body.offsetHeight-30><form name=F><textarea style=width:100%;height:524 name=A wrap></textarea><button onclick=with(opener'+N+'document){write(document.F.A.value);close()}>');F.A.value=eval(S);void(close())}

            488 Zeichen lang. Besser? ;-D

            "Besser?"? Hattest du mich da falsch verstanden? Gemeint hatte ich eigentlich: "Nicht schlecht, mit dem BML im Code fremder Seiten herumpfuschen zu können".

            Es ist ja wirklich gut geeignet, wenn die Seite übersichtlich ist. Da braucht man nichts lokal speichern und kann auf direktem Wege testen. Bei umfangreicherem Code vermisse ich aber sehr schnell den gewohnten Editor-Komfort wie Zeilennummern, unbegrenzt Rückgängig usw.

            Vielleicht solltest du auch noch mehr Zeilenumbrüche reinbringen, einige Seiten sind ja sonst ziemlich chaotisch. Du kannst da ja mal dranbleiben, es läßt sich sicher noch einiges verbessern. Mit den 500 Byte wirst du dann zwar nicht hinkommen, aber eine externe Datei ist eh viel übersichtlicher.

            Grüße, Stefan

            1. Hallo, Zapp!

              "Besser?"? <--> "Nicht schlecht, ..

              ;-)

              Es ist ja wirklich gut geeignet, wenn die Seite übersichtlich ist. Da braucht man nichts lokal speichern und kann auf direktem Wege testen. Bei umfangreicherem Code vermisse ich aber sehr schnell den gewohnten Editor-Komfort wie Zeilennummern, unbegrenzt Rückgängig usw.

              da document.write()'s schon ausgeführt sind, nützt dann auch eine quelltext-verschlüsselung nichts mehr.
              gedacht habe ich das BML eigentlich, um nervige popup-, anti-rightmouse-scripts u.ä. stillzulegen oder mal schnell nachzugucken, wie ein effekt erzeugt wird.

              Vielleicht solltest du auch noch mehr Zeilenumbrüche reinbringen, einige Seiten sind ja sonst ziemlich chaotisch. Du kannst da ja mal dranbleiben, es läßt sich sicher noch einiges verbessern. Mit den 500 Byte wirst du dann zwar nicht hinkommen, aber eine externe Datei ist eh viel übersichtlicher.

              na, bis ich so ein gewaltiges tool zusammengebaut habe wie dein self+, da vergehen sicher noch ein paar monate. ;-)
              ich hab einfach proton als standard-quelltext-editor in die registry eingetragen. der reicht mir fast immer.
              wenn es ein java-applet gäbe, das eine datei vom übergebenen url-parameter einliest, hübsch mit syntaxhilighting und formatierung edtierbar darstellt und auf click den code wieder als string ausgibt, so das man ihn per script wieder zurückschreiben könnte, das wäre eine lösung. ;-D

              freundl. Grüsse aus Berlin, Raik