Paul: Bookmarklet suchen ersetzen

Hallo,
ich hatte in den letzten Tagen eine Frage.

http://forum.de.selfhtml.org/archiv/2007/3/t149468/#m970794

Jetzt erst habe ich die Antwort von Wahsaga gelesen,
danke nochmal, die Idee ist gut und scheint die
einzig Brauchbare zu sein.

Also habe ich begonnen ein wenig mit den
Bookmarlets zu versuchen.

Ich nehme mal www.google.de als Beispielseite.

Füge dort in die Adresszeile ein:

javascript:document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');

Was passiert nun?
Ja das Wort "Unternehmensangebote" wird tatsächlich geändert.

Aber es passieren auch seltsame Dinge:
Google Logo weg
Kryptisches auf den Buttons
...also insgesamt zerschiesst es das Design ein wenig

Was mache ich falsch?

Gruss
Paul

  1. Hi,

    javascript:document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');
    Was passiert nun?

    es wird der Inhalt des HTML-Elements als String genommen, in diesem String wird etwas ersetzt, die Rückgabe dieser Ersetzung wird auf die einzige Weise verwendet, die an dieser Stelle sinnvoll ist: Sie bestimmt den Inhalt des Fensters - schließlich hast Du ja eine (javascript:-)URL angegeben.

    Was mache ich falsch?

    Möchtest Du die Rückgabe der Ersetzung nicht viel lieber in das <html>-Element einfügen?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,

      Möchtest Du die Rückgabe der Ersetzung nicht viel lieber in das <html>-Element einfügen?

      Hmmm, vielleicht schon spät aber ich komme nicht dahinter
      wie du das meinst.

      Gruss
      Paul

      1. Hi,

        Möchtest Du die Rückgabe der Ersetzung nicht viel lieber in das <html>-Element einfügen?
        Hmmm, vielleicht schon spät aber ich komme nicht dahinter
        wie du das meinst.

        jetzt ist es wieder früh. Überlege Dir, was String.replace() eigentlich macht - und was es insbesondere _nicht_ macht.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo Cheatah,

          jetzt ist es wieder früh. Überlege Dir, was String.replace() eigentlich macht - und was es insbesondere _nicht_ macht.

          danke für deine Hilfe, die jedoch nicht gerade sehr hilfreich ist.

          Wenn du schon unbedingt willst, dass ich selbst darauf komme,
          was nicht verkehrt ist, könntest du dennoch ein wenig mehr ins Detail gehen.

          Stattdessen suche ich mir hier einen Wolf:
          http://www.google.de/search?hl=de&q=javascript+String.replace%28%29&meta=

          http://de.selfhtml.org/javascript/objekte/regexp.htm
          http://de.selfhtml.org/javascript/objekte/string.htm#replace

          Und eigentlich klappt es ja auch, nur das eben ausser
          dem Suchwort auch vieles andere geändert dargestellt wird.

          Bist du sicher, dass du überhaupt den Grund dafür weisst,
          oder sind deine Antworten polemischer Natur?

          Paul

          1. Moin!

            jetzt ist es wieder früh. Überlege Dir, was String.replace() eigentlich macht - und was es insbesondere _nicht_ macht.

            danke für deine Hilfe, die jedoch nicht gerade sehr hilfreich ist.

            Wenn du schon unbedingt willst, dass ich selbst darauf komme,
            was nicht verkehrt ist, könntest du dennoch ein wenig mehr ins Detail gehen.

            Beschreibe mal mit deinen eigenen Worten, was String.replace() macht.

            Die Beschreibung in SELFHTML hast du ja schon gefunden.

            Und eigentlich klappt es ja auch, nur das eben ausser
            dem Suchwort auch vieles andere geändert dargestellt wird.

            Warum das so ist, erfährst du, wenn du der Sache auf den Grund gehst.

            Bist du sicher, dass du überhaupt den Grund dafür weisst,
            oder sind deine Antworten polemischer Natur?

            Ich bin sicher, Cheatah kennt den Grund. Ich kenne ihn jedenfalls. Und ich werd' einen Teufel tun, dir die Suche zu verderben - gerade jetzt zu Ostern.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hi

              Und ich werd' einen Teufel tun, dir die Suche zu verderben - gerade jetzt zu Ostern.

              Das hab ich grad aus Versehen gemacht ;-)

              mfg
              Genie

              1. Hallo Genie,

                Und ich werd' einen Teufel tun, dir die Suche zu verderben - gerade jetzt zu Ostern.
                Das hab ich grad aus Versehen gemacht ;-)

                Nein hast du nicht, alle eure Antworten bisher sind für'n Ars..
                Muss schon sagen, dieses Forum ist schon lange nicht mehr was es mal war.

                Paul

                1. Hi

                  Nein hast du nicht, alle eure Antworten bisher sind für'n Ars..

                  Doch in meinem anderen Posting.

                  Muss schon sagen, dieses Forum ist schon lange nicht mehr was es mal war.

                  Die Fragen auch nicht

                  Nochmal:

                  • replace() wird auf einen String angewendet
                  • dieser String wird geändert
                  • replace() gibt diesen bearbeiteten String zurück, der String, den replace() ursprünglich übergeben bekam wird aber nicht verändert(!!!)
                  • Der Rückgabewert muss von dir weiter verarbeitet werden, z. B. dem Ursprungsstring wieder zugeordnet werden

                  document.getElementsByTagName("html")[0].innerHTML
                        =document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');

                  mfg
                  Genie

                  1. Hallo,

                    Nein hast du nicht, alle eure Antworten bisher sind für'n Ars..
                    Doch in meinem anderen Posting.
                    Muss schon sagen, dieses Forum ist schon lange nicht mehr was es mal war.
                    Die Fragen auch nicht

                    Nochmal:

                    • replace() wird auf einen String angewendet
                    • dieser String wird geändert
                    • replace() gibt diesen bearbeiteten String zurück, der String, den replace() ursprünglich übergeben bekam wird aber nicht verändert(!!!)
                    • Der Rückgabewert muss von dir weiter verarbeitet werden, z. B. dem Ursprungsstring wieder zugeordnet werden

                    document.getElementsByTagName("html")[0].innerHTML
                          =document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');

                    Soweit richtig, bis auf die Tatsache, dass innerHTML im IE nur lesend auf das HTML-Element angewendet werden kann. Das Überschreiben wird hier also scheitern.

                    @Paul: Bevor Du wieder "nicht hilfreich" schreist: Den Wert der Eigenschaft innerHTML für das BODY-Element kann man überschreiben.

                    Außerdem ist das "allesaendern" etwas irreführend, weil nur das erste Vorkommen von "Unternehmensangebote" ersetzt wird.

                    @Paul: Wie man das ändert, steht hier: http://de.selfhtml.org/javascript/objekte/string.htm#replace.

                    viele Grüße

                    Axel

                  2. Hallo Genie, nett dass du dich bemühst.

                    Doch in meinem anderen Posting.

                    Nein, das habe ich probiert und geht nicht.

                    • Der Rückgabewert muss von dir weiter verarbeitet werden, z. B. dem Ursprungsstring wieder zugeordnet werden

                    document.getElementsByTagName("html")[0].innerHTML
                          =document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');

                    Auch unter der Promisse habe ich es versucht.
                    Tatsächlich funktioniert nur mein Beispiel im ersten Posting.
                    Aber eben nicht so wie es sollte.

                    Deine Version hingegen klappt gar nicht und meldet nur einen Fehler:
                    "innerhtml eigenschaften konnten nicht festgestellt werden"

                    Trotzdem Danke
                    Paul

                    1. Hi

                      Nein, das habe ich probiert und geht nicht.

                      Deine Version hingegen klappt gar nicht und meldet nur einen Fehler:
                      "innerhtml eigenschaften konnten nicht festgestellt werden"

                      Bei mir (WinXP, Firefox 2.0.0.3) schon. Ohne Fehler oder Meldung.

                      mfg
                      Genie

                2. Hi,

                  alle eure Antworten bisher sind für'n Ars..

                  Die sind alle für Dich. Du bezeichnest Dich also als "Ars.."?

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  Schreinerei Waechter
                  O o ostern ...
                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          2. Hi

            Cheatah hat Recht. replace gibt den bearbeiteten String zurück, er ersetzt aber nicht den Originalstring.
            javascript:void(document.getElementsByTagName("html")[0].innerHTML=document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern'));

            mfg
            Genie

  2. Hallo,

    Also habe ich begonnen ein wenig mit den
    Bookmarlets zu versuchen.

    Ich nehme mal www.google.de als Beispielseite.

    Füge dort in die Adresszeile ein:

    javascript:document.getElementsByTagName("html")[0].innerHTML.replace(/Unternehmensangebote/,'allesaendern');

    Was passiert nun?
    Ja das Wort "Unternehmensangebote" wird tatsächlich geändert.

    Mal unabhängig von allen technischen Problemen: Dass Du per innerHTML nicht nur die sichtbaren Textinhalte ersetzt, sondern möglicherweise z.B. auch URI-Bestandteile in Linkzielen, Teile von Id- und Class-Werten usw., ist Dir bewußt?

    Aber es passieren auch seltsame Dinge:
    Google Logo weg
    Kryptisches auf den Buttons
    ...also insgesamt zerschiesst es das Design ein wenig

    Was mache ich falsch?

    Du rufst ein neues Dokument mit der URI "javascript:...;" auf, dessen HTML-Inhalt aus dem entsprechen ersetzten HTML-Inhalt des HTML-Elements von www.google.de besteht, dessen base URI nun aber eben die neue URI ist, welche damit auch die base URI für alle relative Pfadangaben bspw. im src-Attribut von Grafiken und im href-Attribut von Links ist.

    viele Grüße

    Axel

    1. Hallo Axel,
      vielen Dank für deine Antwort. Scheint logisch zu sein.

      Also ich versuchs mal in eigen Worten:

      Wenn ich den temporär veränderten Quelltext ändere, stimmen
      die Verweise nicht mehr, somit ändern sich u.U. Bilder,scripts, usw.

      Alles bezieht sich dann auf eine falsche URL.

      Das erklärt auch Tests auf anderen Seiten, wo dann die Codierung
      (UTF-8...) nicht mehr stimmt.

      Habe ich das richtig verstanden?

      Ach ja, hilfreicher Tipp war überigens dass innerHTML(html) nur lesend im IE angewandt werden kann.

      Der letzte Link in deinem anderen Posting hier, ja den kenne
      ich. Auf der Basis habe ich das Booklet angefertigt.

      Fazit:
      Also wenn ich mein Ziel erreichen will muss ich alle
      URL übergreifenden Verweise auch gleich mit ändern, richtig ?

      Gruss und nochmals Dank
      Paul

      1. Moin!

        Wenn ich den temporär veränderten Quelltext ändere, stimmen
        die Verweise nicht mehr, somit ändern sich u.U. Bilder,scripts, usw.

        Alles bezieht sich dann auf eine falsche URL.

        Du hast nicht verstanden, was wir dir mitteilen wollten.

        Dein Aufruf (vereinfacht) lautet: javascript: innerHTML.replace();

        Dieser Befehl liefert etwas zurück, und weil der Browser nicht weiß, wohin damit, setzt er die Rückgabe in das aktuelle Browserfenster ein - allerdings mit der Basis-URL des Javascript-Befehls.

        Aufgrund dieser Basis-URL werden dann alle relativ referenzierten Ressourcen des HTML-Quelltextes falsch sein.

        Korrekt wäre hingegen, die Rückgabe der Ersetzung wieder ins ursprüngliche Dokument hineinzupacken:

        javascript: innerHTML = innerHTML.replace();

        Dann wäre die Basis-URL gleichgeblieben, alles würde weiterhin perfekt funktionieren.

        Dass du außerdem noch in den Browser-Bug des IE gerannt bist, der <html> für innerHTML nur lesend verfügbar macht - nun ja, ein unerwünschter Nebeneffekt, der mit deinem Problem nur am Rande zu tun hat.

        Alle Teilnehmer dieses Threads, inklusive Cheatah, haben mehr oder weniger signalisiert, dass deine grundsätzliche Behandlung der Rückgabe von replace() fehlerhaft ist. Lies unter diesem Gesichtspunkt diese Antwort nochmal nach: https://forum.selfhtml.org/?t=149959&m=974205.

        Fazit:
        Also wenn ich mein Ziel erreichen will muss ich alle
        URL übergreifenden Verweise auch gleich mit ändern, richtig ?

        Falsch.

        Du nimmst aus dem aktuellen Dokument den Inhalt. Ersetzt ein Wort. Und mußt das Resultat dann wieder in das aktuelle Dokument hineintun.

        Das aber hast du nicht getan, wurde dir aber von Anfang an gesagt. Und es ist programmiertechnisch ja auch logisch: Wenn ich eine Textvariable habe, in der ich etwas ersetze, und am Ende das geänderte Ergebnis wieder in der Variablen drinstehen soll, muß ich das Ersetzte der Variablen wieder zuweisen.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      2. Hallo,

        Also ich versuchs mal in eigen Worten:

        Wenn ich den temporär veränderten Quelltext ändere, stimmen
        die Verweise nicht mehr, somit ändern sich u.U. Bilder,scripts, usw.
        Alles bezieht sich dann auf eine falsche URL.
        Das erklärt auch Tests auf anderen Seiten, wo dann die Codierung
        (UTF-8...) nicht mehr stimmt.
        Habe ich das richtig verstanden?

        Nein, das alles resultiert daraus, dass Du per javascript-URI ein neues Dokument aufrufst, sobald die JavaScript-Anweisung irgendetwas zurückliefert. Um das zu verhindern, schließt man Bookmarklets üblicherweise in die JavaScript-Anweisung void ein, so wie Genie es auch gemacht hat.

        Ach ja, hilfreicher Tipp war überigens dass innerHTML(html) nur lesend im IE angewandt werden kann.
        Fazit:
        Also wenn ich mein Ziel erreichen will muss ich alle
        URL übergreifenden Verweise auch gleich mit ändern, richtig ?

        Nein, Du machst es so wie Genie aber mit body statt html und beachtest bitte meinen Hinweis darauf, dass Du dann aber nicht nur sichtbaren Text ersetzt. Sollte das irgendwann stören, musst Du ganz anders vorgehen, nämlich zunächst _genau_ den textNode ermitteln, welchen Du ersetzten willst.

        viele Grüße

        Axel

        1. Danke, jetzt funktionierts.

          Auch nochmal Dank an Genie,er konnte ja nicht wissen
          dass ich mit IE unterwegs bin oder innerhtml(html) nicht geht.

          Was deinen Hinweis mit "nicht nur sichtbar" betrifft, ja das
          ist sogar genau das Ziel meines Tests. Siehe erstes Posting,
          *grr bei sowas fällt mir immer auf, dass ich gerne zum ersten
          Posting verweisen möchte aber um den Link zu erfahren müsste ich
          zurück und alle nochmal schreiben.

          Gruss
          Paul

          1. Hi,

            Siehe erstes Posting,
            *grr bei sowas fällt mir immer auf, dass ich gerne zum ersten
            Posting verweisen möchte aber um den Link zu erfahren müsste ich
            zurück und alle nochmal schreiben.

            meld' Dich an, dann kannst Du Dir alle Postings des Threads immer mit anzeigen lassen. Oder Du duplizierst das Fenster und gehst im duplizierten Fenster zurück. Oder ...

            Schönen Sonntag noch!
            O'Brien

            --
            Frank und Buster: "Heya, wir sind hier um zu helfen!"