那麼,經常討論的事情。但我無法得到它的工作。必須完成的工作: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事件。但也許有些時候這會起作用。
你有注入內容腳本到動態麻煩創建iframe?或者你可以注入它,但以後不能與它通信(發送請求)? – serg
@serg好的,那不是很清楚。通過在iframe中注入腳本,我遇到了麻煩。參見EDIT1。 –