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

相關問題