Greasemonkey: Übergeben Sie eindeutige Zeichenfolgendaten an geöffnete Registerkarten?

Erstellt am 7. Nov. 2015  ·  10Kommentare  ·  Quelle: greasemonkey/greasemonkey

Jetzt, da GM_openInTab das Fensterobjekt nicht mehr zurückgibt und wir daher keine Fenstervariablen aus dem Skript setzen können, das das Fenster öffnet, wie kann man eindeutige Zeichenfolgendaten an eine Registerkarte übergeben, die nur für diese Registerkarte bestimmt ist?

Alle 10 Kommentare

Siehe auch https://github.com/greasemonkey/greasemonkey/issues/2134
(wird nur für den Kontext verwendet)

Das bestätigt einfach, dass GM_openInTab null zurückgibt, bezieht sich aber nicht auf meinen Anwendungsfall.

Eine Problemumgehung wäre, der URL einen Anker hinzuzufügen und diesen Anker in einem Skript zu verarbeiten. Für größere Nutzlasten könnten Sie diesen Anker als ID verwenden und dann Broadcast-Kanäle verwenden, damit die Registerkarten miteinander kommunizieren.

Beachten Sie, dass Webinhalte diese Art von Kommunikationskanälen abhören/manipulieren können.

Ich würde Anker aus genau diesem Grund vermeiden.

Sie können damit den GM_info.uuid Label-Kommunikationskanal verwenden.
Als Skript-UUID, die für Skript + Computer + Profil eindeutig ist, ist es sicher genug.
PS: Vergessen Sie nicht, im Metadatenblock // <strong i="8">@grant</strong> GM_info anzugeben.

Das hört sich so an, als würde es für die Kommunikation zwischen verschiedenen Skripten dienen, nicht das gleiche Skript, das auf einer neuen Seite ausgeführt wird.

@Sasstraliss Warum denkst du "es dient der Kommunikation zwischen verschiedenen Skripten"? Das Skript kann keine UUID eines anderen Skripts erhalten - nur die UUID desselben.

Hier ist ein Trick, den ich von reddit gelernt habe. Eine ziemliche Menge an Pseudocode, was Variablen betrifft, aber es könnte helfen. Angenommen, das Zielfenster und das übergeordnete Fenster befinden sich auf Websites, für die das Skript bestimmt ist ...

var stringData;

var awakener = window.opener || window.parent;
if(awakener && awakener != window)
{
    //Used when a page is launched from a link so that passData can...well...pass data. But we can't use onload from there so instead we're using postMessage here to convey to the "parent" window that this window is ready to recieve data
    awakener.postMessage("Loaded","*");
}

window.addEventListener("message", messageDetected, false);

clickableThing.onclick = function() {
    var newWindow = window.open(this.href,this.target);
    passData(window,newWindow,dataToPass);
    return false;
};

function messageDetected(event)
{
    if(typeof(event.data) == "string" && event.data != "Loaded")
    {
        stringData = event.data;
    }
}

function passData(mainWindow,target,data)
{
    mainWindow.addEventListener("message", passItOn, false);
    function passItOn(event)
    {
        if(event.source == target) target.postMessage(data,"*");
    }
}

@DoomTay , bitte verwenden Sie dreifache Backquotes , um die Quellformatierung beizubehalten.

@ the8472 sagte:

Sendekanäle nutzen

Leider ist dies eine experimentelle Technologie, die nur in Fx38+ verfügbar ist. Eine geeignetere Lösung wäre die Verwendung der localStorage- API und von Speicherereignissen . siehe http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen