3

有没有办法将消息从全局页面发送到特定选项卡
我目前正在做的是,在标签页创建时,注入的脚本创建一个唯一的ID并将此号码的消息发送到全局页面,全局页面保存此号码。
如果全局页面需要发送一些数据到一个标签(即:标签#3),那么全局页面将“广播”一个消息到所有标签号码为#3作为传递给标签的数据的一部分(遍历所有选项卡并向每个选项卡发送消息)。
有没有像Chrome一样的东西(例如:chrome.tabs.sendRequest(tabID, {action: 'respond', params:[channel,msg,async]});)?Safari扩展将消息发送到特定选项卡

现在我正在做的是在注入的脚本方面,每个脚本都有一个侦听器来捕获这条消息。如果内容脚本唯一编号等于全局页面发送的编号,则此消息用于此,否则doNothing

在Safari中有更简单更优雅的方式吗?

回答

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'); 
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", {}); 
+0

和你必须做额外的事情来处理新的Safari浏览器,并提前提取许多页面,我认为 – 2014-08-18 21:06:32

相关问题