2012-09-27 82 views
1

我想從一個選項卡傳遞值到另一個。我試過sessionStorage和剪貼板,但目前還沒有運氣。這裏是演示和代碼以及:如何在瀏覽器標籤之間傳遞一個值?

https://builder.addons.mozilla.org/package/154290/latest/

什麼它試圖做的就是選定的文本,並將其傳遞給打開的選項卡:

// Create a new context menu item. 
var menuItem = contextMenu.Item({ 
    label: "Check with Proofread Bot", 
    context: contextMenu.SelectionContext(), 
    contentScript: 'self.on("click", function() {' + 
       ' var text = window.getSelection().toString();' + 
       ' sessionStorage.setItem("proofread_bot_chrome", text);' + 
       ' self.postMessage(text);' + 
         '});', 
    onMessage: function(text) { 
     clipboard.set(text); 
     //sessionStorage.setItem("proofread_bot_chrome", text); 
     tabs.open({ 
      url: "http://proofreadbot.com", 
      onOpen: function onOpen(tab) { 
      // do stuff like listen for content 
      // loading. 
      alert(clipboard.get()); 
      alert(selection.text); 
      sessionStorage.setItem("proofread_bot_chrome", clipboard.get()); 
      } 
     }); 
    } 
}); 
+0

感謝我的Firefox剪貼板去。 – giorgio79

回答

1

sessionStoragelocalStorage總是綁定到一個域。內容腳本使用網頁的特權運行,這意味着他們訪問該網頁的會話存儲 - 對於傳遞數據不是很有用。他們根本沒有剪貼板訪問權限。

這意味着您無法避開「傳統」消息傳遞。當你打開選項卡時,你應該附加一個內容腳本,等待它準備好(內容腳本可以發送一條消息來表明這一點),並將文本發送給它。事情是這樣的:

onOpen: function(tab) { 
    var worker = tab.attach({ 
    contentScript: "self.on('message', function(text) {alert(text);});" + 
        "self.postMessage(null);", 
    onMessage: function() { 
     worker.postMessage(text); 
    } 
    }); 
} 

參考:Communicating using postMessage()

+0

你有沒有試用contentScript中的'alert(text)'? –

+0

@CharlesJourdan:如果你問我 - 不,我沒有。此內容腳本將導致類似「文本未定義」的錯誤消息。爲什麼它應該產生其他東西? –

+0

mmmh我不確定,但是當我只用警報進行測試時,我在正確的頁面之前看到一個about:blank頁面。也許如果你把'worker.postMessage(text);'放在準備好的事件上,它會更好。 –

0

你應該嘗試的localStorage而不是sessionStorage。 localStorage由來自同一來源的文檔共享。 雖然它仍然保留在標籤關閉,這可能會或可能不會取決於您的要求。

sessionStorage是每個文檔,因此不在標籤之間共享。

+0

他們不在同一個域中,所以這不會有幫助。 –

相關問題