2011-08-24 165 views
1

那麼,經常討論的事情。但我無法得到它的工作。必須完成的工作:Chrome擴展程序:通信iframe <->內容腳本

  • 內容或後臺腳本必須與iframe進行通信,反之亦然。
  • iframe在我的手下,所以有一切可能。

我試了很多。它根本不起作用。例如:如果我通過(manifest)在allFrames = true的每個頁面上部署內容腳本。好的,有道理。 iframe稍後創建,因此不會調用觸發器。因此,讓我們這樣做:創建iframe,然後發送executeScript請求:

chrome.tabs.executeScript(tabinst.tab_id, { allFrames: true, file:'frame.js'}, function() { 
     console.log("done"); 
}); 

但這也行不通。有沒有人有解決方案與XDM iframe和chrome擴展進行通信?

PS:這將如何很好的是,如果Chrome擴展將使上的iframe的postMessage

EDIT1:

的代碼不會被注入的iframe。場景:

文件「file.js」中有一個簡單的foo函數。現在,我在iframe創建並顯示後2秒將上述語句應用於此。這個函數foo在iframe中不可用,但是在內容腳本中。試圖在iframe中執行foo(通過單擊)引發ReferenceError。

因此,這不是一個時間的事情。如果我通過manifest和all_frames true應用腳本,則無關緊要。如果這可行,content_script將可用。但不是。

EDIT2: @serg

是啊,謝謝,那作品!我剛剛通過它。我的問題是,我認爲當調用chrome.tabs.executeScript的回調時,請求的腳本結束並且包含DOM操作完成。但事實並非如此。花費一些時間直到iframe中的腳本和包含的偵聽器已準備就緒。

所以我不得不從iframe中的該腳本發送chrome.extension.sendRequest,然後從背景偵聽器中啓動一些代碼來操作iframe。謝謝你的幫助。

PS:也可以在沒有「all_frames」的情況下執行:true。動態iframe準備就緒需要一些時間。超時有效。在大多數情況下,這沒有用,但也許有人首先有另一個用戶交互。

PPS:我仍然不明白爲什麼它可能是這樣的,並且不可能發送postMessage事件。但也許有些時候這會起作用。

+0

你有注入內容腳本到動態麻煩創建iframe?或者你可以注入它,但以後不能與它通信(發送請求)? – serg

+0

@serg好的,那不是很清楚。通過在iframe中注入腳本,我遇到了麻煩。參見EDIT1。 –

回答

2

我剛剛測試和內容腳本被注入動態創建的iframe(我使用清單)。我認爲問題在於你試圖在iframe中訪問內容腳本的功能,這是不允許的。

裏面你的iframe,你不能只是做:

<a onclick="contentScriptFunction()"></a> 

你需要從內容腳本中添加事件偵聽器:

$("a").click(contentScriptFunction); 
+0

謝謝。以上更多信息。 –

相關問題