2012-07-05 16 views
4

我正在編寫一個Chrome擴展並提出問題。打開數據並將其傳遞給內容腳本中的彈出式窗口(新選項卡)

我的擴展名有一些.html頁面,讓它成爲'popup.html'。我將一個內容腳本注入某個頁面,此腳本在一個新選項卡中打開一個'popup.html',其中包含'var p = window.open(chrome.extension.getURL('/ popup.html'),「popup」 )',它完美的工作。接下來,我需要傳遞一些數據到這個窗口,我不知道如何以一種簡單的方式做到這一點。

出於某種原因,我無法從內容腳本

var p = window.open(chrome.extension.getURL('/popup.html'), "popup"); 
p.foo(data); 

在控制檯中調用子窗口的功能,我看到遺漏的類型錯誤:無法調用未定義消息的方法「富」。

我無法在查詢字符串中傳遞數據,因爲數據太大了。

有沒有一種優雅和簡單的方式來傳遞數據到這種窗口?我想過消息傳遞,但是如何使用背景頁面有效地獲取新打開的窗口的標籤ID?

非常感謝。

UPD: 我試圖逆邏輯,並從父窗口數據與「window.opener.foo()」,但在新打開的選項卡window.opener返回null

+1

我認爲這個問題更正確的標題應該是「打開並傳遞數據到新標籤」。 'popup'是Chrome擴展中的一個特定術語,它似乎不是您正在使用的內容。 – ripper234

回答

4

好的,我發現了兩個解決方案,我的問題。

1)添加一個背景頁面,該頁面打開一個帶有chrome.tabs.create()的彈出窗口。然後從內容腳本發送消息到後臺頁面,通過chrome.tabs.sendMessage()將其重新發送到相應的選項卡。它看起來有點難看,但起作用。

2)更好的一個,沒有背景頁面。擴展(彈出)頁面爲長連接創建一個監聽器。然後,內容腳本向該連接發送消息。這裏的一個問題是在頁面打開後沒有創建監聽器,所以應該有一個內容腳本的機制等待,直到加載彈出框。它可以是一個簡單的setTimeout或通過相同的長期連接彈出通知。

如果有人有更好的解決方案,我很樂意檢查出來。

+0

你的第一個解決方案似乎是被接受的。看到這個答案:http://stackoverflow.com/questions/20019958/chrome-extension-how-to-send-data-from-content-script-to-popup-html –

相關問題