2010-09-01 66 views
7

在我的擴展中,我試圖確定一個新標籤是否被創建爲另一個標籤的彈出框,如果是,哪個標籤。Chrome擴展內容腳本可以訪問window.opener嗎?

我想我可以使用內容腳本中的window.opener來幫助解決這個問題。但它看起來像window.opener不能在內容腳本中正常工作。

當我手動創建一個選項卡時,它的window.opener是空預期。

當一個選項卡被另一個選項卡創建爲彈出式選項卡時,其window.opener未定義。我可以從中推斷出該選項卡是作爲一個彈出框創建的,但我無法使用它來確定哪個選項卡創建了新選項卡。

這是一個已知問題,是否有人知道任何解決方法?

+0

可能的重複http://stackoverflow.com/questions/3124543/is-it-possible-to-determine-a-tabs-opener-within-a-google-chrome-extension – npdoty 2010-09-11 02:34:35

+0

是的,看起來像它。但是,這兩個問題都沒有得到解答。 – Greg 2010-09-13 16:42:40

+0

[我們現在傾向於讓類似的問題站起來。](http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned-停止擔憂和愛複製/) – Will 2011-01-28 13:41:51

回答

16

我沒有仔細研究這個問題,但我想我可以指出你在正確的方向。內容腳本不能從父窗口訪問變量,因爲它是沙盒。一種解決方法是直接在網頁上運行的代碼,要做到這一點,你需要注入一個腳本標籤中腳本:

你的內容腳本應該是這樣的:

function injectJs(link) { 
     var scr = document.createElement("script"); 
     scr.type="text/javascript"; 
     scr.src=link; 
     (document.head || document.body || document.documentElement).appendChild(scr); 
} 

injectJs(chrome.extension.getURL("inject.js")); 

現在你可以運行你的代碼,而沙盒限制,如果它是正確的網頁上:

inject.js:

alert(window.opener); 

我假設你想現在回到將此信息傳遞給巴ckground頁面,這是您無法使用Chrome API的另一個挑戰。好消息是,內容腳本可以訪問DOM並監聽DOM事件,因此您可以使用它們將信息傳遞給內容腳本,將其發送到後臺頁面。我很肯定你應該能夠註冊一個自定義的DOM事件,並讓你的內容腳本聽它(自己還沒有試過這部分)。

+0

我最終解決了我的問題,使用這樣的方法;在頁面中注入大量代碼並使用'postMessage'在框架之間以及頁面和我的內容腳本之間進行通信。這很痛苦,但似乎大部分時間都在工作。 – Greg 2011-01-31 20:04:47

+3

任何機會看到這個'注入的腳本 - >內容腳本 - >背景頁面'通信的一些例子。來自@Greg或@serg我正在努力解決當前確切的問題 – kevzettler 2012-07-19 19:29:40

+2

@kevzettler您可以注入一個腳本,它將'window.desiredData'作爲屬性存儲在'document.body'中,然後從內容中讀取屬性 - 腳本(因爲他們共享相同的DOM) – levi 2014-06-30 23:47:50

相關問題