Kann ein greasemonkey-Skript wissen, was in eine andere Registerkarte geladen wurde?

2008
Kevin Fegan

Ich plane, ein Greasemonkey-Skript zu schreiben, das unter einer bestimmten URL (@include oder @match) ausgeführt wird, aber ich hätte es gerne, wenn ich eine oder mehrere zusätzliche Registerkarten mit derselben URL öffne Das Greasemonkey-Skript wird NICHT auf den zweiten (und weiteren) doppelten Seiten ausgeführt.

Nehmen wir beispielsweise an, ich habe ein Greasemonkey-Skript, das Änderungen an einer Webseite "ändert" (oder auf andere Weise "modifiziert"), wenn ich "google.com" öffne. Ich möchte in der Lage sein, eine weitere Registerkarte für "google.com" zu öffnen, auf der das Greasemonkey-Skript nicht ausgeführt wird. Oder, richtiger, wird ausgeführt, erkennt jedoch, dass sie bereits läuft, und ändert die Seite auf der ersten Registerkarte und dann auf der zweiten Registerkarte auf "Beenden". Die zweite Registerkarte bleibt geöffnet, wird aber vom Skript nur "nicht beeinflusst".

Ich weiß nicht, ob ein Greasemonkey-Skript andere geöffnete Registerkarten "sehen" kann, aber wenn es möglich ist, wollte ich zuerst prüfen, ob bereits eine andere Registerkarte in diese Seite geladen wurde, und dann beenden, falls dies der Fall war.

Aber es müsste ein bisschen komplizierter sein als das, weil:

  1. Wenn der erste Tab geschlossen und ein neuer ("dritter") Tab für diese URL geöffnet wurde, möchte ich, dass das Greasemonkey-Skript ausgeführt wird und diese Seite "ändert", wie auf der ersten Seite.
  2. Wenn ich die erste Registerkarte "aktualisieren" sollte (beispielsweise nach dem Bearbeiten des Greasemonkey-Skripts oder aus einem anderen Grund), möchte ich, dass das Greasemonkey-Skript ausgeführt wird und die neu geladene Seite "modifiziert".

Es scheint also, dass das Greasemonkey-Skript entweder:

  1. Überprüfen Sie die URL der anderen Registerkarten, um eine "Übereinstimmung" zu finden, und suchen Sie dann unter "In diese Registerkarte schauen", ob das Greasemonkey-Skript diese Seite "aktiv" geändert hat (suchen Sie nach einer versteckten, leeren "DIV" oder anderen Seite) Element).
  2. Verwenden Sie eine Art "lokaler Speicher" oder "globale (Superglobal?) - Variablen", um die Registerkarten beim Öffnen und Schließen zu verfolgen.

Ich bin nicht auf der Suche nach jemandem, der dieses Skript für mich schreibt. Ich glaube, ich bin in der Lage, das Skript zu schreiben, wenn ich wusste, wie man einige Dinge tut. Wenn es ein Skript gibt, das all dies oder das meiste davon bereits erledigt, wäre das auch großartig.

Um zu beginnen, muss ich wissen, ob (und wie) ein Greasemonkey-Skript vorliegt:

  1. Kann andere Registerkarten "sehen".
  2. Kann die URLs (und möglicherweise den "Titel" -Text) der anderen Registerkarten lesen.
  3. Prüfen Sie auf der anderen Registerkarte, ob Elemente vorhanden sind (und möglicherweise gelesen, aber nicht geschrieben werden).
  4. Verwalten Sie "lokalen (Computer-) Speicher" oder verwalten Sie "tabellenübergreifende globale Variablen" (wenn dies überhaupt möglich ist).
1

1 Antwort auf die Frage

4
Brock Adams

Greasemonkey kann nicht:

  1. Siehe andere Registerkarten.
  2. Überprüfen Sie die URLs anderer Registerkarten.
  3. Suchen Sie nach DOM-Knoten / -Elementen in anderen Registerkarten.

Der Grund ist, dass Greasemonkey, Tampermonkey usw. diese APIs nicht für / für Benutzerscripts verfügbar machen.
(Vollwertige Browsererweiterungen können all diese Dinge tun.)


Greasemonkey kann:

  1. Cross-Kommunikation zwischen Skriptinstanzen mit GM_setValue()Doc und GM_getValue()Doc .
  2. Manchmal können Sie auch verwenden .postMessage(). ( Beispiel )
    Dies funktioniert wahrscheinlich nur für Sie, wenn Sie window.opendie neue Registerkarte erstellen.
  3. Da Sie sich auf derselben Domain befinden, können Sie auch localStorageCookies verwenden, um die Kommunikation zu unterbrechen.
  4. Wenn die neuen Registerkarten schließlich von der Hauptregisterkarte aus geöffnet werden, können Sie über URL-Parameter (oder den Hashwert) mit der neuen Registerkarte kommunizieren. Ein Beispiel dafür finden Sie in diesem Benutzerskript . (Beachten Sie, wie die SEMC-Links behandelt werden.)

Ich bin nicht auf der Suche nach jemandem, der dieses Skript für mich schreibt. Ich glaube, ich bin in der Lage, das Skript zu schreiben, wenn ich wusste, wie man einige Dinge tut. Wenn es ein Skript gibt, das all dies oder das meiste davon bereits erledigt, wäre das auch großartig.

Alle Teile und Teile wurden in Stack Overflow angesprochen, aber nicht in einer Frage, an die ich mich erinnere.

Wenn Sie Variablen für die Kommunikation verwenden (Methoden 1 oder 3), stellen Sie sicher, dass Sie über einen beforeunloadEvent-Handler verfügen, der die Variablen löscht, bevor die Masterseite geschlossen wird.