4

グローバルページから特定のタブにメッセージを送信する方法はありますか?
私が現在行っているのは、タブの作成時に、挿入されたスクリプトが一意のIDを作成し、この番号のメッセージをグローバルページに送信し、グローバルページがこの番号を保存することです。
グローバルページがタブ(つまり、tab #3)にデータを送信する必要がある場合、グローバルページは、タブに渡されるデータの一部として番号を含むメッセージをすべてのタブに「ブロードキャスト」し#3ます(すべてのタブを繰り返して送信します)各タブへのメッセージ)。
Chromeのようなものはありますか:(つまり:) chrome.tabs.sendRequest(tabID, {action: 'respond', params:[channel,msg,async]});

現在私が行っているのは、挿入されたスクリプト側で、各スクリプトにこのメッセージをキャッチするリスナーがあるということです。コンテンツスクリプトの一意の番号がグローバルページによって送信された番号と等しい場合、このメッセージはそのためのものです。それ以外の場合はdoNothing

Safariでこれを行うためのより簡単でエレガントな方法はありますか?

4

2 に答える 2

5

グローバルページのメッセージイベントハンドラー内で、event.targetメッセージの受信元のタブを参照します。例えば:

function handleMessage(e) {
    if (e.name === 'whatIsMyUrl?') {
        e.target.page.dispatchMessage('yourUrlIs', e.target.url);
    }
}
safari.application.addEventListener("message", handleMessage, false);

Safari拡張APIにはタブIDがありませんが、各タブを連想配列に保持し、そのインデックスを使用して後でアドレス指定することができます。例えば:

function handleMessage(e) {
    if (e.name === 'hereIsMyId') {
        myTabs[e.message] = e.target;
    }
}
safari.application.addEventListener("message", handleMessage, false);

// later...
myTabs[someId].page.dispatchMessage('haveSomeCake');
于 2012-03-26T20:55:27.697 に答える
1

サファリアンサー

グローバルページでタブに直接保存します。たとえば、挿入されたスクリプトからのメッセージ

// global page
safari.application.addEventListener("message", function(event){
    switch(event.name){
        case "saveData":
            event.target.page.tabData = { data: myData }
        break;
        case "getData":
            event.target.page.dispatchMessage("tabData", myData);
        break;
    }
}, false);

-

// injected page

// first save data
safari.self.tab.dispatchMessage("saveData", {firstname:"mike", age: 25} );

// setup listner to recevie data
safari.self.addEventListener("message", function(event){
    switch(event.name){
        case "tabData":
            // get data for page
            console.debug(event.message);
            // { firstname: "mike", age: 25 }
        break;
    }
}, false);

// send message to trigger response
safari.self.tab.dispatchMessage("getData", {} );
于 2014-08-18T21:05:16.723 に答える