Bookmarklet funktioniert auf einigen Webseiten nicht

  • Hallo,

    Um bei Recherchen im www ein Paar Mausklicks bei jeder Suchanfrage zu sparen habe ich so ein QSB-Bookmarklet gebaut:

    Zitat

    javascript:s=document.getSelection();for(i=0;i<frames.length;i++){s=frames[i].document.getSelection();if(s)break;}if(!s)void(s=prompt('Geben%20Sie%20einen%20Suchwort%20ein.%20Sie%20k%C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren, %20bevor%20Sie%20erweiterungen-Suche%20starten.',''));if(s){erweiterungenW=open('http://www.erweiterungen.de/suche?q='+escape(s),'_self');}

    Markiert man eine Zeichenfolge in einer Webseite und klickt man auf QSB-Symbol in der Lesereichen-Symbolleiste wird erweiterungen.de nach der markierten Zeichenfolge durchsucht. QSB funktioniert auch, aber nicht auf allen Webseiten.

    Um vorweg zu nehmen, Noscript-Einstellungen spielen bei diesem Problem keine Rolle, also

    • QSB-Bookmarklet funktioniert auf Websites, z.B. firefox-browser.de, für die im NoScript keine explizite Erlaubnis gegeben ist.
    • und QSB funktioniert nicht auf Websites, z.B. administrator.de, für die im NoScript eine explizite Erlaubnis eingestellt ist.

    Auf manchen Webseiten erkennt QSB nicht, dass eine Zeichenfolge bereits markiert ist und gibt prompt(...)- Meldung aus. Mir scheint, dass QSB versagt auf Webseiten, die mit JavaScripts reichlich gespickt sind.

    Kann jemand sagen, was die Ursache für das Versagen von QSB sein kann? Oder gibt's eventuell eine andere Lösung, die es erlaubt, mit einem Klick in der Toolbar/Lesezeichen-Symbolleiste eine bestimmte Website, z.B. erweiterungen.de nach der markierten Zeichenfolge zu durchsuchen? Im Kontextmenüs wird zwar eine Möglichkeit geboten die markierte Zeichenfolge in dem gerade aktiven Suchplugin zu suchen, aber diese Lösung bietet nicht die mit QSB mögliche Flexibilität.

  • Zu deinem eigentlichen Problem weiß ich nichts.

    Zitat

    Oder gibt's eventuell eine andere Lösung, die es erlaubt, mit einem Klick in der Toolbar/Leserzeichen-Symbolleiste eine bestimmte Website, z.B. erweiterungen.de nach der markierten Zeichenfolge zu durchsuchen?


    Nicht mit einem Klick. Aber mit Easy DragToGo kannst du einstellen, dass das ziehen eines markierten Elementes z.B. nach oben oder unten oder zur Seite auf einer einstellbaren Seite nach dem Element sucht.

  • Zitat von Wurstwasser

    Zu deinem eigentlichen Problem weiß ich nichts.

    Nicht mit einem Klick. Aber mit DragToGo kannst du einstellen, dass das ziehen eines markierten Elementes z.B. nach oben oder unten oder zur Seite auf einer einstellbaren Seite nach dem Element sucht.

    Danke für den Tip. DragToGo-Lösung ist aber für meine Zwecke wenig brauchbar. Aus mehreren Gründen:

    • als Tablet-PC User nutze ich die in DragToGo reservierte Drag/Drop-Gesten für Kopieren/Verschieben von Texten in Webseiten, z.B. während man einen Beitrag im Forum schreibt
    • die Anzahl von zu durchsuchenden Websites ist auf die Anzahl von Drag/Drop-Gesten beschränkt
    • die Erstellung von Searchplugins für zu durchsuchende Websites wie erweiterungen.de und die Zuordnung von diesen Websites den Gesten in DragToGo ist zu umständlich im Vergleich zu einer Bookmarklet-Lösung - die leider auch begrenzt einsetzbar ist. :?
  • Wie wäre es mit einer Beispielseite, bei der der Code nicht funktioniert?

    Btw. die alte Überschrift war deutlich passender.

    Generell:
    - Packe deinen Code in eine anonyme Funktion, dann gibt es keine Konflikte mit Code in der Seite.
    - Dein Code für Frames ist nicht rekursiv. Du greifst so nur die erste Frame-Ebene ab.
    - void braucht es in dem Code nicht

    • Zitat von boardraider

      > Wie wäre es mit einer Beispielseite, bei der der Code nicht funktioniert?
      . . .
      > Dein Code für Frames ist nicht rekursiv. Du greifst so nur die erste Frame-Ebene ab.

    • diese QSB-Variante mit Frame-Abfrage funktioniert auf http://de.selfhtml.org/navigation/suche/index.htm , wo in der Webseite Frames verwendet werden, aber funktioniert nicht auf administrator.de:

      Zitat

      javascript:s=document.getSelection();for(i=0;i<frames.length;i++){s=frames[i].document.getSelection();if(s)break;}if(!s)void(s=prompt('Geben%20Sie%20einen%20Suchwort%20ein.%20Sie%20k%C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren, %20bevor%20Sie%20erweiterungenSuche%20starten.',''));if(s){erweiterungenW=open('http://www.erweiterungen.de/suche?q='+escape(s),'_self');}

    • diese Variante ohne Frame-Abfrage funktioniert _nicht_ auf http: //http://de.selfhtml.org/navigation/suche/index.htm, (die markierte Zeichenfolge wird nicht erkannt) aber funktioniert auf http://administrator.de :

      Zitat

      javascript:s=document.getSelection();if(!s)void(s=prompt('Geben%20Sie%20einen%20Suchwort%20ein.%20Sie%20k%C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren,%20%20bevor%20Sie%20erweiterungen-Suche%20starten.',''));if(s){erweiterungenW=open('http://www.administrator.de/index.php?x=0&…scape(s),'_self')}

    • diese Variante

      Zitat

      javascript: function( ){s=document.getSelection();for(i=0;i<frames.length;i++){s=frames[i].document.getSelection();if(s)break;}if(!s)void(s=prompt('Geben%20Sie%20einen%20Suchwort%20ein.%20Sie%20k%C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren, %20bevor%20Sie%20erweiterungenSuche%20starten.',''));if(s){erweiterungenW=open('http://www.erweiterungen.de/suche?q='+escape(s),'_self');}}

      von der ich gedacht habe, dass es eine anonyme Funktion ist, wird nicht ausgeführt. Mit
      anonymen Funktionen in JavaScript habe ich keine Erfahrungen. Was habe ich falsch gemacht?

  • Damn. Ich würde dieses etwas was du Code nennst mal vernünftig ausschreiben mit Einrückung. Dann mal Syntax Highlighting verwenden und nochmal überprüfen ob du den wirklich richtig entziffert hast.

    Mozilla/5.0 (X11; U; Linux x86_64; de-DE; rv:1.9.1.1) Gecko/20090702 Firefox/3.5

  • Zitat

    aber funktioniert nicht auf administrator.de


    Die Seite enthält einen iframe. Dadurch ist die Länge von frames.length > 0 und dein s wird mit Null belegt, da im iframe keine Selektion erfolgt. Somit siehst du dann die Abfrage. Auf der anderen Seite klappt es natürlich, da diese ein reguläres Frameset verwendet und du in einem der Frames der ersten Ebene den Text auswählst.

    Zitat

    aber funktioniert auf http://administrator.de :


    Genau aus den genannten Gründen, nur diesmal anders herum. Im einen Fall traversierst du die Frames nicht und findest auch keine Auswahl. Auf administrator.de wird die Auswahl erkannt und nicht mehr durch die Anwendung der Schleife auf den iframe überschrieben.

  • Code
    javascript:(function(){var%20s;function%20gT(d){if(d.getSelection)%20return%20d.getSelection();%20return%20d.selection.createRange().text;} %20function%20gS(w){try{s=gT(w.document);if(s)%20return;for(var%20i=0;f=w.frames[i];i++){gS(f);
    if(s)%20return;}}%20catch(e){}}%20gS(window);%20if(!s)%20s=prompt('Geben%20Sie%20einen%20Suchwort%20ein.%20Sie%20k%C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren, %20bevor%20Sie%20erweiterungenSuche%20starten.','');if(s){var%20w=open();w.location='http://www.erweiterungen.de/suche?q='+escape(s);w.document.close();w.focus();}})()

    Versuch mal das. Sollte auch im IE laufen.

    Lesbarer formatiert:

    Den letzten Teil kannst du natürlich auch anpassen, dass sich kein neues Fenster öffnet.

    Die Funktion gS ist rekursiv, dadurch erfasst du auch geschachtelte Frames.

  • danke, boardraider

    es funktioniert tadellos :) Noch eine Frage - ich brauche die QSB- Lösung für den Internet-Explorer zwar nicht, aber einfach interessant zu wissen, ob es Möglichkeit gibt, im Internet Explorer die Abfrage in einem neuen Tab und nicht im neuen Fenster, wie in der jetzigen Lösung zu öffnen?

    boardraider
    BTW: kannst du bitte in deinem Beiträg im Code im Abschnitt

    Zitat

    %C3%B6nnen%20ebenfalls%20ein%20Wort%20auf%20einer%20Webseite%20markieren,
    %20bevor%20Sie%20erweiterungenSuche%20starten.','');

    vor der Zeichenfolge %20bevor%20Sie einen Leerzeichen einfügen - wie eben im Zitat oben? Der Code bleibt funktionsfähig und der QSB-Thread ohne den horizontalen Scrollbalken wird besser lesbar - auch auf kleineren Displays - wie mein . :)

  • Was der Browser mit open() anfängt kann man mit JavaScript nicht beeinflussen. Mit dem Fx kann man über entsprechende Einstellungen oder Erweiterungen das Verhalten steuern. Ggf. ist das auch im IE möglich. Da müsste ich mir das aber auch erstmal genauer ansehen.