这是一个经常被讨论的话题。但是我不能让它工作。必须做什么:
- 内容或背景脚本必须与iframe通信,反之亦然。
- iframe在我的手下,所以有一切可能。
我试了很多。它根本不起作用。例如:如果我使用allFrames=true via (manifest)在每个页面上部署内容脚本。好吧,说得通。稍后创建iframe,因此不会调用触发器。那么让我们这样做:创建iframe,然后发送一个executeScript请求:
chrome.tabs.executeScript(tabinst.tab_id, { allFrames: true, file:'frame.js'}, function() {
console.log("done");
});
但这也不行。有没有人解决方案与XDM框架和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也可以。它只是需要一些时间,直到动态框架准备好。有了超时,它就可以工作了。在大多数情况下,这是没有用的,但可能有人先有另一个用户交互。
PPS:我仍然不明白为什么这样是可能的,而不可能发送postMessage事件。但也许在某些情况下,这是可行的
我刚刚测试和内容脚本被注入到动态创建的iframes(我使用manifest)。我认为问题是你试图在iframe内访问内容脚本的功能,这是不允许的。
在你的iframe中你不能只做:
<a onclick="contentScriptFunction()"></a>
您需要从内容脚本中添加事件侦听器:
$("a").click(contentScriptFunction);