Greasemonkey: 開いているタブに一意の文字列データを渡しますか?

作成日 2015年11月07日  ·  10コメント  ·  ソース: greasemonkey/greasemonkey

GM_openInTabがウィンドウオブジェクトを返さなくなったため、ウィンドウを開くスクリプトからウィンドウ変数を設定できなくなったので、そのタブ専用に指定されたタブに一意の文字列データを渡すにはどうすればよいでしょうか。

全てのコメント10件

https://github.com/greasemonkey/greasemonkey/issues/2134も参照してください
(コンテキストにのみ使用)

これは、GM_openInTabがnullを返すことを確認するだけですが、私のユースケースを参照していません。

回避策の1つは、URLにアンカーを追加し、そのアンカーをスクリプトプロセスに含めることです。 より大きなペイロードの場合、そのアンカーをIDとして使用し、ブロードキャストチャネルを使用してタブを相互に通信させることができます。

Webコンテンツは、これらの種類の通信チャネルをリッスン/操作できることに注意してください。

まさにその理由でアンカーを避けたいと思います。

GM_info.uuidラベル通信チャネルを使用できます。
スクリプト+コンピューター+プロファイルに固有のスクリプトUUIDとして、十分に安全です。
PS:メタデータブロックで// <strong i="8">@grant</strong> GM_infoすることを忘れないでください。

これは、新しいページで実行されている同じスクリプトではなく、異なるスクリプト間で通信するためのもののように聞こえます。

@Sasstralissなぜ「異なるスクリプト間で通信するためだ」と思いますか? スクリプトは異なるスクリプトのUUIDを取得できません。同じUUIDのみを取得できます。

これが私がredditから学んだトリックです。 変数に関する限り、かなりの量の擬似コードが役立つかもしれません。 ターゲットウィンドウと親ウィンドウがスクリプトの対象となるサイトにあると仮定します...

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 、ソースのフォーマットを維持するためにトリプルバッククォートを使用してください。

@ the8472は言った:

放送チャンネルを使用する

残念ながら、これはFx38 +でのみ利用可能な実験技術です。 より適切な解決策は、 localStorageAPIストレージイベントを使用することです。 http://stackoverflow.com/questions/2236828/javascript-communication-between-tabs-windows-with-same-origin/12514384#12514384を参照してください

このページは役に立ちましたか?
0 / 5 - 0 評価