有没有办法将消息从全局页面发送到特定标签?
我目前正在做的是,在创建选项卡时,注入的脚本会创建一个唯一的ID,并将带有此编号的消息发送到全局页面,全局页面会保存此编号。
如果全局页面需要将一些数据发送到选项卡(即:选项卡#3
),则全局页面将向所有选项卡“广播”一条消息,其中包含数字#3
作为传递给数据的数据的一部分选项卡(遍历所有选项卡并向每个选项卡发送消息)。
是否有类似Chrome的东西:(即:chrome.tabs.sendRequest(tabID, {action: 'respond', params:[channel,msg,async]});
)?
现在我正在做的是在注入的脚本端,每个脚本都有一个侦听器来捕获此消息。如果内容脚本唯一编号等于全局页面发送的编号,则此消息是针对它的,否则为doNothing
。
在Safari中有更简单更优雅的方法吗?
答案 0 :(得分:4)
在全局页面的消息事件处理程序中,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');
答案 1 :(得分:0)
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", {} );