4

有没有办法将消息从全局页面发送到特定选项卡
我目前正在做的是,在创建选项卡时,注入的脚本会创建一个唯一的 id 并将带有此编号的消息发送到全局页面,并且全局页面会保存此编号。
如果全局页面需要将一些数据发送到选项卡(即: tab #3),那么全局页面将向所有选项卡“广播”一条消息,其中数字#3作为传递给选项卡的数据的一部分(遍历所有选项卡并发送消息到每个选项卡)。
有没有像 Chrome: (ie: 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

Safari 答案

在您的全局页面中直接保存到选项卡.. 例如来自注入脚本的消息

// 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 回答