Zapp: IE-Bookmarklet

Hallo Leute!

Ich habe etwas mit Bookmarklets rumgespielt und war überrascht, wie weit sich das Forum damit verbiegen läßt. Man kann die Klicks abfangen, die gelinkten Seiten dann in einem selbst definierten Fenster öffnen und nach dem Laden fast beliebig verändern.

Mein Bookmarklet kann

  • Nachrichten in JS-Fenstern öffnen
  • in den Nachrichten den gesamten Thread anzeigen
  • geöffnete Nachrichten in der Hauptdatei als gelesen markieren
  • die Formularfelder vorbelegen
  • unverlinkte URLs verlinken (Klick auf "http" bzw. "www")
  • gepostete / Homepage-Links in neuen Fenstern öffnen

Es kann leider nicht

  • Links zu Nachrichten zeigen, die neuer sind als die Hauptdatei
  • automatisch geladen werden

Nach jedem Reload der Hauptdatei muß es also manuell nachgeladen werden. Dazu hatte ich einiges probiert, doch ohne Erfolg. Vielleicht wäre der Zugriff auf ein Bookmarklet über JS auch eine Sicherheitslücke, da die Bookmarklets ja erweiterte Rechte haben.
Oder gibts da vielleicht doch 'ne Möglichkeit?

Hier ist das Skript (getestet mit IE 5.0 + 5.5):

[InternetShortcut]
URL=javascript:N='Jeeves';E='spam@all.de';U='www.home77.de';G='';P='scrollbars,status,resizable';d=document;b='_blank';d.body.onclick=J;function J(x){B=x?x:window;C=B.event.srcElement;K=B.d.all.tags;if(!K('DL')[0].contains(C)){if(x&&K('TT')[0].contains(C)){if(C.href)C.target=b;else with(B){r=d.body.createTextRange();r.moveToPoint(event.x,event.y);r.expand('word');if(r.text.charAt(0)=="'")r.moveStart('character',1);if(r.text.substr(0,4)=='http'||r.text=='www'){r.moveEnd('sentence',1);n=r.text;u=['\r','\n','"',"'",',','[','(',' ',')',']'];for(i in u)n=n.split(u[i])[0];r.findText(n);r.execCommand('CreateLink',false,n.charAt(0)=='w'?'http://'+n:n);}}}return true;}L=C.href?C:C.parentNode;if(L.href){S=[];T=C;while(T.parentNode.parentNode.tagName!='BODY'){D=0;while(T.previousSibling){D++;T=T.previousSibling;}S[S.length]=D;T=T.parentNode;}S.reverse();if(!x){V=open(L.href+'#a1','',P);R=T;}W=V.location;W.href=L.href+'#a1';I();return false;}}function I(){e=0;if(W.href==L.href+'#a1'&&V.document.all.bottom)setTimeout('Y()',50);else if(e<50){e++;setTimeout('I()',500);}}function Y(){V.d=V.document;p=V.d.all;if(p.url){W.hash='#a1';V.d.body.onclick=Q;p.name.value=N;p.email.value=E;p.url.value+=U;p.image.value+=G;M=p.tags;p.body.value='Hallo '+M('H2')[0].innerText.split(':')[0].split(' ')[0]+',\n\n'+p.body.value+'\n\nGrüße,\n '+N;with(M('P')[1])with(lastChild)if(tagName=='A')target=b;if(M('DL')[0])M('DL')[0].outerHTML='';M('H3')[0].outerHTML='<dl><dd id=X>'+R.innerHTML+'</dd></dl><h3>Eigene Antwort schreiben</h3>';t=[p.X,R];for(j in t){for(i in S)t[j]=t[j].childNodes[S[i]];t[j].style.color=j<1?'#ee6600':'#552200';}}}function Q(){if(!V.closed&&V.event)return(J(V));}void(0);

Um es so kurz wie möglich zu halten (mehr als 2073 Zeichen sind nicht erlaubt), sind alle Namen auf ein Zeichen gekürzt, so dass jetzt garantiert niemand mehr da durchsteigt. Bei Interesse könnte ich aber auch den Klartext posten.

Eine Frage habe ich noch: Die Funktion "gepostete URLs in Links umwandeln" finde ich gut, doch die Links posaunen den Referrer raus, was ja vielleicht nicht immer erwünscht ist. Wie aber kann ich das umgehen? Wird z.B. der Referrer auch bei open() übermittelt, oder wenn ich per location.href in ein blank geöffnetes Fenster lade?

Grüße aus Berlin,

Stefan

  1. Hallo Zapp,

    Gefällt mir sehr gut, eins der besten BMLs die ich bisher hier gesehen habe!

    Leider bin ich zu selten auf IE unterwegs ;(

    Eine Frage habe ich noch: Die Funktion "gepostete URLs in Links umwandeln" finde ich gut, doch die Links posaunen den Referrer raus, was ja vielleicht nicht immer erwünscht ist. Wie aber kann ich das umgehen? Wird z.B. der Referrer auch bei open() übermittelt, der wenn ich per location.href in ein blank geöffnetes Fenster lade?

    I beg your pardon ???

    Tschuess,
     Rolf

    1. Hallo Rolf,

      Eine Frage habe ich noch: Die Funktion "gepostete URLs in Links umwandeln" finde ich gut, doch die Links posaunen den Referrer raus, was ja vielleicht nicht immer erwünscht ist. Wie aber kann ich das umgehen? Wird z.B. der Referrer auch bei open() übermittelt, oder wenn ich per location.href in ein blank geöffnetes Fenster lade?

      I beg your pardon ???

      Das BML wandelt gepostete, aber nicht verlinkte URLs in Links um, sobald man auf "http" oder "www" klickt. Möglicherweise hat aber der Poster ganz bewußt nicht verlinkt, damit die Leute copy&paste benutzen - und damit keinen Referrer übergeben.
      Das ist ja sicher ein sehr seltener Fall, den man aber vielleicht trotzdem ausschließen könnte. Man darf ja nicht vergessen, dass man hier am Verhalten fremder Dokumente manipuliert.

      Grüße, Stefan

      1. Hallo zusammen,

        vieleicht bin ich ja nur zu doof, aber bei mir geht das BML garnicht.

        Ich kriege den IE nicht dazu da irgendetwas sinnvolles draus zu machen, entweder er interpretiert es als URL, was natürlich Käse ist oder macht garnix.

        Ich fände es toll wenn ihr mir etwas bescheidene Nachhilfe dazu geben könntet. (Ich nehme auch einen Link zur Nachhilfe, aber hier hab ich nichts wirklich erhellendes gefunden)

        Danke
        Boris

        1. Hallo Boris,

          Ich kriege den IE nicht dazu da irgendetwas sinnvolles draus zu machen, entweder er interpretiert es als URL, was natürlich Käse ist oder macht garnix.

          Doch, das mit der URL ist genau richtig. Es sieht nur so aus, als ob er gar nichts macht.

          Um es kurz zu testen, kannst du es kopieren, angefangen beim "javascript: ... ganze Zeile bis zum ... viod(0);" und in die Eingabezeile einfügen. Dann drückst du die Eingabetaste oder klickst auf "Wechseln zu".

          Wenn du es öfter benutzen willst, kannst du es in den Favoriten speichern. Dazu kopierst du den gesamten Block, also angefangen bei "[InternetShortcut] ... bis zum ... void(0);" z.B. nach Notepad, und speicherst diese Datei in deinem Favoritenverzeichnis (meistens C:\windows\favoriten) unter dem Namen "set_self.url" oder so. Danach kannst du sie aus den Favoriten aufrufen.

          Wenn du es auf die eine oder andere Art aufgerufen hast (nachdem die Forumsseite vollständig geladen ist), kannst du mit der linkten Maustaste auf die Beiträge klicken, um sie in einem neuen Fenster zu öffnen. Die rechte Maustaste brauchst du dann gar nicht mehr, alle Links in den Beiträgen öffnen sich in neuen Fenstern. Wenn eine URL angegeben, aber nicht verlinkt ist, kannst du auf "http" oder "www" klicken.

          Datei anpassen: In der ersten Zeile: N=Name, E=Email, U=Homepage (wenn du keine angeben willst, sollte da '' stehen), dann G für Grafik-URL. Unter P kannst du beliebige Angaben ergänzen, z.B. dem Fenster eine feste Größe und Position verpassen.

          Viel Spass

          Stefan

          1. Hallo Zapp,

            Hah, da diese Antwort mit meinem Namen vorversehen war und aus einem zweiten Fenster kommt scheine ich es verstanden zu haben.

            <noanswer> Bin doch garnicht so doof wie ich aussehe </noanswer>

            Viel Spass

            Danke, habe ich

            Saludos
            Boris

      2. Hallo Zapp,

        Das BML wandelt gepostete, aber nicht verlinkte URLs in Links um, sobald man auf "http" oder "www" klickt. Möglicherweise hat aber der Poster ganz bewußt nicht verlinkt, damit die Leute copy&paste benutzen - und damit keinen Referrer übergeben.
        Das ist ja sicher ein sehr seltener Fall, den man aber vielleicht trotzdem ausschließen könnte. Man darf ja nicht vergessen, dass man hier am Verhalten fremder Dokumente manipuliert.

        Ich hab jetzt ne viertelstunde gesucht um zu finden, worauf du hinaus möchtest. BMLs müssen soviele
        Features auf engstem Raum enthalten, dass die Bedienung etwas 'unkonventionell' ausfällt. Deswegen muß man leider noch mehr arbeit in die Doku als ins BML stecken. :-|

        IMHO ist dieses Feature overkill, weil der Fall nicht sehr oft vorkommt. Wenn du gerne das BML damit verbreiten möchtest solltest du dir dann überlegen lieber gleich automatisch alle URLs im Text in Links zu verwandeln. Im übrigen gibts auch crossbrowser BMLs
        die den mit der Maus selektierten URL-text öffnen.

        Dein referrer-Problem kann ich auch nicht ganz nachvollziehen, warum sollte als referrer nicht forum.de.selfhtml.org auftauchen??? Da mach dir lieber keinen Kopf!

        Tschau
          Rolf

        PS: Vielleicht hab ich demnächst Zeit auch meine BMLs so aufzubohren, allerdings ohne document.all. (Macht Spaß, oder? ;)

        1. Hallo Rolf,

          Ich hab jetzt ne viertelstunde gesucht um zu finden, worauf du hinaus möchtest. BMLs müssen soviele
          Features auf engstem Raum enthalten, dass die Bedienung etwas 'unkonventionell' ausfällt. Deswegen muß man leider noch mehr arbeit in die Doku als ins BML stecken. :-|

          Ja, du hast recht, sorry. Ich hatte die Funktionen zwar ganz am Anfang aufgezählt, hätte aber viel mehr und vor allem Verständlicheres dazu schreiben müssen.

          PS: Vielleicht hab ich demnächst Zeit auch meine BMLs so aufzubohren, allerdings ohne document.all. (Macht Spaß, oder? ;)

          Macht wirklich Spaß, und was für Perspektiven ergeben sich, wenn man erst mal anfängt, lokale .js-Dateien einzubinden...
          Crossbrowser habe ich sehr schnell aufgegeben, und document.all ist vor allem schön kurz. Bei den Möglichkeiten mit DOM bin ich aber auch nicht so besonders fit, und die Ausdrücke wurden alle elendig lang ("contains" z.B. konnte ich nur über eine Schleife abfragen, in der die parentNodes hochgezählt werden). Aber deshalb bin ich natürlich gespannt, wie du da rangehst.

          Grüße, Stefan

          P.S: Ich melde mich heute abend noch mal wg dem Klartext. Vielleicht schaffe ich es auch noch, ein paar Kommentare einzufügen.

          1. Hi Stefan

            ... mal anfängt, lokale .js-Dateien einzubinden...

            Das würde mich seeehr wundern wenn es klappt.
            IMO verletzt es das Sicherheitsmodell!

            Aber man könnte BMLs anders um zig KB aufbohren! :-)

            Bye
            Rolf

            1. Moin,

              ... mal anfängt, lokale .js-Dateien einzubinden...

              Das würde mich seeehr wundern wenn es klappt.
              IMO verletzt es das Sicherheitsmodell!

              Du hast recht, das will er nicht. Ich hatte das zwar gerade vor einem bekannten Namen in der JS-Newsgroup gelesen, aber es scheint wirklich nicht zu gehen.

              Aber man könnte BMLs anders um zig KB aufbohren! :-)

              Nun sag' schon! :-)

              Grüße, Stefan

              1. Hi Stefan

                Nun sag' schon! :-)

                <Zier> Ich wills erst fertig ausgetestet haben und hab erst in ner Woche Zeit dafür.
                Die Konsequenzen sind zu gewaltig um das einfach rauszuposaunen.
                BMLs scheitern bisher an ihrer Größe. So könnte man nicht nur nen
                kompletten Selfbrowser in JS realisieren, man könnte einige Pagebetreiber
                deren Nutzungskonzept vorsieht, dass kein Mensch stoisch die gleichen
                Vorgänge wiederholt, sehr viele Kopfschmerzen bereiten. </zier>

                Cheers

                Rolf

                PS: Aber vielleicht findet es ja jmd vorher raus ;)

  2. Hallo Zapp,

    Ein wirklich geniales Bookmarklet - alle Achtung! Bring mich wieder dazu, IE fürs Forumsbesuchen zu benutzen, wo ich doch eben angefangen hatte, Mozilla zu nehmen... ;-)

    [Klammer auf: Allerdings hat er (Mozilla, Version 0.9.7) neben den Grafik-Darstellungsproblemen, über die ich hier berichtet habe, auch noch Probleme mit dem Selektieren von Text im Textarea...: manchmal selektiert er von da an, wo der Cursor kurze Zeit *zuvor* im Textarea stand, auch wenn ich mittlerweile den Cursor an anderer Postition gebracht habe - seltsames, unangehmenes Phänomen... - und: wenn man einem Link der Hautpdatei folgt, und dann den Backbutton benutzt, ist die Hauptdatei vom Beginn an angezeigt und nicht die Stelle, von wo aus ich geklickt habe, also wo der Link sich befindet, dem ich gefolgt bin... Will sagen: Nachricht öffnen, lesen und zurück zur Hautpdatei über den Backbutton impliziert erneutes Nach-Unten-Scrollen - ist bei IE/Opera nicht der Fall --- :Klammer zu]

    Aber, kann man das Bookmarklet dazu bringen, auch in der Datei "Neue Nachricht verfassen" die Felder vorzubelegen?

    Ich möchte das Bookmarklet im frz. Forum vorstellen, dort habe ich bereits einen Thread über Bookmarklets stehen. Wäre das OK?

    Grüße,
     Patrick

    1. Hallo Patrick,

      Aber, kann man das Bookmarklet dazu bringen, auch in der Datei "Neue Nachricht verfassen" die Felder vorzubelegen?

      Im Prinzip natürlich schon, die Frage ist nur, ob der Platz reicht. Eventuell könnte man diese Linkerkennung dafür rausnehmen. Ich guck mir das heute abend mal an, wenn ich Zeit habe...

      Ich möchte das Bookmarklet im frz. Forum vorstellen, dort habe ich bereits einen Thread über Bookmarklets stehen. Wäre das OK?

      Na klar!

      Grüße, Stefan

    2. Hi,

      Aber, kann man das Bookmarklet dazu bringen, auch in der Datei "Neue Nachricht verfassen" die Felder vorzubelegen?

      Das hatte ich ja irgendwie ganz übersehen, wohl weil ich hier viel lese, aber selbst kaum schreibe. Aber das ist natürlich sinnvoll, und war auch leicht einzubauen (falls ich nichts übersehen habe).

      Also mit allem Vorbehalt, ist nur kurz getestet:

      [InternetShortcut]
      URL=javascript:N='Jeeves';E='spam@all.de';U='www.home77.de';G='';A='Hallo Forum\n\n\n\nGrüße';P='scrollbars,status,resizable';d=document;b='_blank';d.body.onclick=J;function J(x){B=x?x:window;C=B.event.srcElement;K=B.d.all.tags;q=(!x&&C==K('B')[6])?1:0;if(!K('DL')[0].contains(C)&&(!q)){if(x&&K('TT')[0].contains(C)){if(C.href)C.target=b;else with(B){r=d.body.createTextRange();r.moveToPoint(event.x,event.y);r.expand('word');if(r.text.charAt(0)=="'")r.moveStart('character',1);if(r.text.substr(0,4)=='http'||r.text=='www'){r.moveEnd('sentence',1);n=r.text;u=['\r','\n','"',"'",',','[','(',' ',')',']'];for(i in u)n=n.split(u[i])[0];r.findText(n);r.execCommand('CreateLink',false,n.charAt(0)=='w'?'http://'+n:n);}}}return true;}L=C.href?C:C.parentNode;if(L.href){S=[];T=C;if(!q)while(T.parentNode.parentNode.tagName!='BODY'){D=0;while(T.previousSibling){D++;T=T.previousSibling;}S[S.length]=D;T=T.parentNode;}S.reverse();if(!x){V=open(L.href+'#a1','',P);R=T;}W=V.location;W.href=L.href+'#a1';I();return false;}}function I(){e=0;if(W.href==L.href+'#a1'&&V.document.all.bottom)setTimeout('Y()',50);else if(e<50){e++;setTimeout('I()',500);}}function Y(){V.d=V.document;p=V.d.all;if(p.url){W.hash='#a1';V.d.body.onclick=Q;p.name.value=N;p.email.value=E;p.url.value+=U;p.image.value+=G;M=p.tags;p.body.value=q?A:'Hallo '+M('H2')[0].innerText.split(':')[0].split(' ')[0]+',\n\n'+p.body.value+'\n\nGrüße,\n '+N;if(q)return;with(M('P')[1])with(lastChild)if(tagName=='A')target=b;if(M('DL')[0])M('DL')[0].outerHTML='';M('H3')[0].outerHTML='<dl><dd id=X>'+R.innerHTML+'</dd></dl><h3>Eigene Antwort schreiben</h3>';t=[p.X,R];for(j in t){for(i in S)t[j]=t[j].childNodes[S[i]];t[j].style.color=j<1?'#ee6600':'#552200';}}}function Q(){if(!V.closed&&V.event)return(J(V));}void(0);

      Bye, Stefan

      1. Hallo Zapp,

        Also mit allem Vorbehalt, ist nur kurz getestet:

        Thanks, funktioniert prima!

        [InternetShortcut]
        URL=javascript:N='Jeeves';E='spam@all.de';U='www.home77.de';G='';A='Hallo Forum\n\n\n\nGrüße';P='scrollbars,status,resizable';d=document;b='_blank';d.body.onclick=J;function J(x){B=x?x:window;C=B.event.srcElement;K=B.d.all.tags;q=(!x&&C==K('B')[6])?1:0;if(!K('DL')[0].contains(C)&&(!q)){if(x&&K('TT')[0].contains(C)){if(C.href)C.target=b;else with(B){r=d.body.createTextRange();r.moveToPoint(event.x,event.y);r.expand('word');if(r.text.charAt(0)=="'")r.moveStart('character',1);if(r.text.substr(0,4)=='http'||r.text=='www'){r.moveEnd('sentence',1);n=r.text;u=['\r','\n','"',"'",',','[','(',' ',')',']'];for(i in u)n=n.split(u[i])[0];r.findText(n);r.execCommand('CreateLink',false,n.charAt(0)=='w'?'http://'+n:n);}}}return true;}L=C.href?C:C.parentNode;if(L.href){S=[];T=C;if(!q)while(T.parentNode.parentNode.tagName!='BODY'){D=0;while(T.previousSibling){D++;T=T.previousSibling;}S[S.length]=D;T=T.parentNode;}S.reverse();if(!x){V=open(L.href+'#a1','',P);R=T;}W=V.location;W.href=L.href+'#a1';I();return false;}}function I(){e=0;if(W.href==L.href+'#a1'&&V.document.all.bottom)setTimeout('Y()',50);else if(e<50){e++;setTimeout('I()',500);}}function Y(){V.d=V.document;p=V.d.all;if(p.url){W.hash='#a1';V.d.body.onclick=Q;p.name.value=N;p.email.value=E;p.url.value+=U;p.image.value+=G;M=p.tags;p.body.value=q?A:'Hallo '+M('H2')[0].innerText.split(':')[0].split(' ')[0]+',\n\n'+p.body.value+'\n\nGrüße,\n '+N;if(q)return;with(M('P')[1])with(lastChild)if(tagName=='A')target=b;if(M('DL')[0])M('DL')[0].outerHTML='';M('H3')[0].outerHTML='<dl><dd id=X>'+R.innerHTML+'</dd></dl><h3>Eigene Antwort schreiben</h3>';t=[p.X,R];for(j in t){for(i in S)t[j]=t[j].childNodes[S[i]];t[j].style.color=j<1?'#ee6600':'#552200';}}}function Q(){if(!V.closed&&V.event)return(J(V));}void(0);

        Funktioniert auch im frz. Forum, leider nicht das Vorbelegen der Felder beim Klick auf "Rédiger un nouveau message" -> auch die Datei wird in einem normalen Fenster geöffnet anstatt im leistenlosen Popup... Ich habe festgestellt, dass hier "Neue Nachricht verfassen" der 13. Link in der Datei ist, bei "uns" ist es aber nur der 12. Link, alldieweil wir noch keine Forumsarchivsuche haben.

        Ich konnte die Stelle jedoch nicht finden, wo ich ansetzen kann, um das zu ändern, so dass es im frz. Forum auch geht. Wenn Du also kurz mal bei "uns" schauen könntest: http://selfforum.selfhtml.com.fr/ - Thanks!

        Grüße,
         Patrick

        1. Moin Patrick,

          ... Ich habe festgestellt, dass hier "Neue Nachricht verfassen" der 13. Link in der Datei ist, bei "uns" ist es aber nur der 12. Link, alldieweil wir noch keine Forumsarchivsuche haben.

          Bei den fett geschriebenen Links wird nicht der Link als Auslöser des Events zurückgegeben, sondern das im Link enthaltene <b>. Es ist die Stelle q=(!x&&C==K('B')[6])?1:0; Statt 6 muss das bei euch wohl 4 heißen.

          Grüße, Stefan

          1. Hallo Zapp,

            Bei den fett geschriebenen Links wird nicht der Link als Auslöser des Events zurückgegeben, sondern das im Link enthaltene <b>. Es ist die Stelle q=(!x&&C==K('B')[6])?1:0; Statt 6 muss das bei euch wohl 4 heißen.

            Danke, habe ich geändert und der Link geht im Popup auf. Leider hängt der IE (bei mir: 5.5 sp2) beim Klick in die Auswahlliste (Themenliste). Da hilft nur noch strg alt entf ...

            Dem Bookmarklet widme ich trotzdem einen Thread, wenn ich es schaffe, heute noch ;-)

            Grüße,
             Patrick

            1. Hallo Patrick,

              Leider hängt der IE (bei mir: 5.5 sp2) beim Klick in die Auswahlliste (Themenliste). Da hilft nur noch strg alt entf ...

              Ja, stimmt. Ich hatte versäumt, dieses Fenster vom body.onclick auszuklammern. Bei jedem Klick checkt er, ob in die Definitionsliste (Threadbaum) geklickt wurde, die es aber in diesem Fenster gar nicht gibt.
              Das meinte ich aber mit "unter Vorbehalt".

              Erneut unter Vorbehalt:

              [InternetShortcut]
              URL=javascript:N='Jeeves';E='spam@all.de';U='www.home77.de';G='';A='Hallo Forum\n\n\n\nGrüße';P='scrollbars,status,resizable';d=document;b='_blank';d.body.onclick=J;function J(x){B=x?x:window;C=B.event.srcElement;K=B.d.all.tags;q=(!x&&C==K('B')[6])?1:0;if(!K('DL')[0].contains(C)&&(!q)){if(x&&K('TT')[0].contains(C)){if(C.href)C.target=b;else with(B){r=d.body.createTextRange();r.moveToPoint(event.x,event.y);r.expand('word');if(r.text.charAt(0)=="'")r.moveStart('character',1);if(r.text.substr(0,4)=='http'||r.text=='www'){r.moveEnd('sentence',1);n=r.text;u=['\r','\n','"',"'",',','[','(',' ',')',']'];for(i in u)n=n.split(u[i])[0];r.findText(n);r.execCommand('CreateLink',false,n.charAt(0)=='w'?'http://'+n:n);}}}return true;}L=C.href?C:C.parentNode;if(L.href){S=[];T=C;if(!q)while(T.parentNode.parentNode.tagName!='BODY'){D=0;while(T.previousSibling){D++;T=T.previousSibling;}S[S.length]=D;T=T.parentNode;}S.reverse();if(!x){V=open(L.href+'#a1','',P);R=T;}W=V.location;W.href=L.href+'#a1';I();return false;}}function I(){e=0;if(W.href==L.href+'#a1'&&V.document.all.bottom)setTimeout('Y()',50);else if(e<50){e++;setTimeout('I()',500);}}function Y(){V.d=V.document;p=V.d.all;if(p.url){W.hash='#a1';if(!q)V.d.body.onclick=Q;p.name.value=N;p.email.value=E;p.url.value+=U;p.image.value+=G;M=p.tags;p.body.value=q?A:'Hallo '+M('H2')[0].innerText.split(':')[0].split(' ')[0]+',\n\n'+p.body.value+'\n\nGrüße,\n '+N;if(q)return;with(M('P')[1])with(lastChild)if(tagName=='A')target=b;if(M('DL')[0])M('DL')[0].outerHTML='';M('H3')[0].outerHTML='<dl><dd id=X>'+R.innerHTML+'</dd></dl><h3>Eigene Antwort schreiben</h3>';t=[p.X,R];for(j in t){for(i in S)t[j]=t[j].childNodes[S[i]];t[j].style.color=j<1?'#ee6600':'#552200';}}}function Q(){if(!V.closed&&V.event)return(J(V));}void(0);

              Im französischen Forum muss die 6 natürlich wieder eine 4 sein.

              Grüße, Stefan

              1. Hallo Zapp!

                Solele, ich habe Dein Bookmarklet im frz. Forum gepostet. Ich habe etwas hinzugefügt, was ich auch in meinem Bookmarklet fürs deutsche Forum eingebaut habe. Das zeigt durch eine Farbänderung, ob das Bookmarklet aktiv ist. Praktisch, wenn man reloadet hat, und nicht mehr so weiß...

                if(d.title.indexOf('Neue')==-1)d.getElementsByTagName('td')[2].style.color='#FF0000';

                Hier ändert es die Farbe der 3. Tabellenzelle (dort steht SELFHTML Forum) zu rot. Im frz. Forum habe ich das in der 8. Tabellenzelle eingebaut, dort steht bei "uns" der Ladezeitpunkt.

                Vielen Dank noch mal an Dich, und wenn Dich der Thread interessiert, hier ist er:

                http://selfforum.selfhtml.com.fr/?m=73&t=15

                Grüße,
                Patrick

                1. Hallo Patrick,

                  ... Das zeigt durch eine Farbänderung, ob das Bookmarklet aktiv ist. Praktisch, wenn man reloadet hat, und nicht mehr so weiß...

                  Nette Idee, und für das kleine Forum ja auch o.k., nur hier ist der Header doch meistens nicht im Blickfeld, und bevor ich scrollen müsste, würde ich wohl eher das BML nachladen.

                  http://selfforum.selfhtml.com.fr/?m=73&t=15

                  Oho, sieht schon nach etwas Arbeit aus, gut gegliedert, alle Feinheiten erläutert. Bei dir werden die Franzmänner ja richtig gut geholfen. ;-) Leider versteh ich kaum was...

                  Was noch fehlt, wäre vielleicht ein wenig Resonanz, aber das ist ja in diesem Forum nicht anders, wenn auch wohl aus anderen Gründen.

                  A+, (?)
                  Stefan

                  P.S.: Ne Macke hat das Teil aber immer noch, wenn man auf News oder Chat klickt. Leider ist mir das gar nicht plausibel...

                  1. Hallo Zapp!

                    A+, (?)

                    hehe, a+ ou @+ = à plus tard - also: bis später, bis nachher, bis dann...

                    a12c4 ou @12c4 gibt es auch noch und bedeutet: à un de ces quatre (matins), was so gut heisst wie: bis die Tage...

                    ;-)

                    P.S.: Ne Macke hat das Teil aber immer noch, wenn man auf News oder Chat klickt.

                    Ist mir auch aufgefallen. Die Datei wird sowohl im Haupt- wie im unter den Funktionen chat() oder news() des Forums definierten Fenster geöffnet.

                    Grüße,
                    Patrick

  3. Hallo Stefan,

    Mir fällt interessanterweise auf dass dein BML im IE die Forumshauptdatei viel schneller "verbiegt" als mein "target2reader":

    javascript:var L=document.links; for (var l in L) if (l>10 && l<L.length-4) { void(L[l].target="reader"); void(L[l].hash="a1"); };

    document.all zugriffe scheint der IE bevorzugt zu behandeln!

    Könntest du deinen Code noch mal formatiert posten,
    ich bekomm leider sonst nen Knick in der Optik ;)

    Tschuess
       Rolf

    1. Hallo Rolf,

      document.all zugriffe scheint der IE bevorzugt zu behandeln!

      Ich greife ja nicht auf jeden einzelnen Link zu, sondern setze nur einen body.onclick

      Könntest du deinen Code noch mal formatiert posten,
      ich bekomm leider sonst nen Knick in der Optik ;)

      Es gab da noch kleinere Änderungen, aber im Prinzip ist es dies hier:

      -------------------------------------------------

      Name='';
      Email='';
      URL='';
      Grafik='';
      Params='scrollbars,status,resizable';

      document.body.onclick=checkForLink;

      function checkForLink(x)  // bei Klick in der Hauptdatei ohne, bei Klick im Popup mit Parameter
      {
      Base=x?x:window;
      ClickObj=Base.event.srcElement;
      if(!Base.document.all.tags('DL')[0].contains(ClickObj))   // Klick nicht im Threadbaum?
       {
       if(x&&Base.document.all.tags('TT')[0].contains(ClickObj))   // Klick Postingteil Popup?
        {
        if(ClickObj.tagName=='A')                 // Link erwischt?
         ClickObj.target='_blank';
        else with(Base)
         {
         Range=document.body.createTextRange();  // ff Worterkennung http oder www > Link
         Range.moveToPoint(event.x,event.y);
         Range.expand('word');
         if(Range.text.charAt(0)=="'")
          Range.moveStart('character',1);
         if(Range.text.substr(0,4)=='http'||Range.text=='www')
          {
          Range.moveEnd('sentence',1);
          RText=Range.text;
          Limiter=['\r','\n','"',"'",',','[','(',' ',')',']'];
          for(i in Limiter)
           RText=RText.split(Limiter[i])[0];
          Range.findText(RText);
          Range.execCommand('CreateLink',false,RText.charAt(0)=='w'?'http://'+RText:RText);
          }
         }
        }
       return true;
       }
      LinkObj=ClickObj.tagName=='A'?ClickObj:ClickObj.parentNode;   // Zweig: Klick im Threadbaum
      if(LinkObj.tagName=='A')
       {
       ThreadPath=[];                                //  ff Ermitteln des Pfades zum geklickten
       Thread=ClickObj;                              //     Link im aktuellen Thread-Baum
       while(Thread.parentNode.parentNode.tagName!='BODY')
        {
        ChildCount=0;
        while(Thread.previousSibling)        // Position auf jeder Objektebene wird ermittelt
         {
         ChildCount++;
         Thread=Thread.previousSibling;
         }
        ThreadPath[ThreadPath.length]=ChildCount;   // Array für die Position im Thread
        Thread=Thread.parentNode;
        }
       ThreadPath.reverse();
       if(!x)                                        // wenn aus Hauptdatei aufgerufen
        {
        pop=open(LinkObj.href+'#a1','',Params);
        MainThread=Thread;
        }
       pop.location.href=LinkObj.href+'#a1';
       checkLoad();
       return false;
       }
      }

      function checkLoad()
      {
      count=0;
      if(pop.location.href==LinkObj.href+'#a1'&&pop.document.all.bottom)  // Popup geladen?
       setTimeout('insert()',50);
      else if(count<50)                               // wenn nicht, weitere 50x abfragen
       {
       count++;
       setTimeout('checkLoad()',500);                // im Abstand von 0.5 sec
       }
      }

      function insert()
      {
      if(pop.document.all.url)              // falls nicht die Forums-Fehlermeldung
       {                                   // ...woran man nicht alles denken muß... :)
       pop.location.hash='#a1';
       pop.document.body.onclick=getPopLink;
       with(pop.document.all)
        {
        name.value=Name;                  // ff Formularwerte setzen
        email.value=Email;
        url.value+=URL;
        image.value+=Grafik;
        body.value='Hallo '+tags('H2')[0].innerText.split(':')[0].split(' ')[0]+',\n\n'+pop.document.all.body.value+'\n\nGrüße,\n '+Name;
        with(tags('P')[1])
         if(lastChild.tagName=='A')      // HP-URL angegeben?
          lastChild.target='_blank';
        if(tags('DL')[0])
         tags('DL')[0].outerHTML='';                     // Original-Threadbaum löschen
        tags('H3')[0].outerHTML='<dl><dd id=popThread>'+MainThread.innerHTML+'</dd></dl><h3>Eigene Antwort schreiben</h3>';
        }
       ThrArray=[pop.document.all.popThread,MainThread];
       for(j in ThrArray)
        {
        for(i in ThreadPath)                     // Farbänderungen auf zuvor ermitteltem Pfad
         ThrArray[j]=ThrArray[j].childNodes[ThreadPath[i]];
        ThrArray[j].style.color=j<1?'#ee6600':'#552200';
        }
       }
      }

      function getPopLink()           // Eventhandler im Popup
      {
      if(!pop.closed&&pop.event)
       return(checkForLink(pop));
      }

      void(null);

      -------------------------------------------------

      Bye, Stefan

      1. Hi Stefan

        Wieder was dazugelernt was nicht in Selfhtml steht

        ClickObj=Base.event.srcElement;

        Mit event.srcElement für IE oder event.target für NS bekommt
        man hier das Objekt des angeklickten Links geliefert. Sehr nützlich!

        Bitte an den anderen Stefan:
        in </selfhtml/javascript/objekte/event.htm> doch
        event.target hinzunehmen! Scheint mir die ECMA-Variante zu sein.

        Bye

        Rolf