javascript google chrome扩展iframe无法检查contentWindow

javascript google chrome扩展iframe无法检查contentWindow,javascript,iframe,google-chrome-extension,Javascript,Iframe,Google Chrome Extension,我正在写一个谷歌浏览器的扩展。现在我需要检查iframe的内容,但内容脚本似乎无法访问此内容,即使调试器可以。iframe内容是我以前发送到该站点的消息列表。如果我在内容脚本中放入以下语句,它将始终返回null: document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow.document; 但是,如果我打开调试器并从命令行执行相同的命令,它将返回包含适当内容的“Docu

我正在写一个谷歌浏览器的扩展。现在我需要检查iframe的内容,但内容脚本似乎无法访问此内容,即使调试器可以。iframe内容是我以前发送到该站点的消息列表。如果我在内容脚本中放入以下语句,它将始终返回null:

document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow.document;
但是,如果我打开调试器并从命令行执行相同的命令,它将返回包含适当内容的“Document”。起初我认为这是因为框架还没有完成加载,所以我找到了这样一个片段并尝试使用它

function wait4Iframe2Load() {
   // Get a handle to the iframe element
   //console.log('Checking for null myFrame');
    var myFrame = document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow;
    if (myFrame!=null) 
    {
        console.log(myFrame);
       // Check if loading is complete
       if ( myFrame.document.readyState == 'complete' ) {
          // The loading is complete, call the function we want executed once the iframe is loaded
          console.log('Loading Complete');
          //frameContent=document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow.document.getElementsByTagName('tbody')[0];
          return;
       }
       else alert(" Frame is Not Loaded");
    }
    else myFrame = document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow;
   // If we are here, it is not loaded. Set things up so we check the status again in 100 milliseconds
   console.log('Waiting for frame to load...');
   window.setTimeout('wait4Iframe2Load()', 100);      
}
这只是永远返回null。但是,当这个脚本堆积控制台消息时,我可以打开调试器并执行相同的命令行,它将返回一个文档。面对这个问题,并研究互联网的答案,似乎这可能是某种故意的安全问题。不管是不是,我都需要检查iframe的内容,并确定我以前在那里写了什么,这样我就可以决定下一步在那里写什么


有人知道如何解决这个问题吗?

这个想法是将内容脚本注入到这个iframe中,并使用它来获取所需的信息

据我所知,这个框架有一个预先知道的特定url,因此您可以通过清单(使用
all_frames
选项)注入脚本

如果出于某种原因需要动态注入,则有:

chrome.tabs.executeScript(tabId, {allFrames: true});
它将被注入父页面和iframe页面。然后在注入的内容脚本中,您可以检查它是否在正确的iframe中运行。例如,动态注入的内容脚本可能如下所示(如果您注入它,但不需要清单url检查):


对不起,杰罗姆,你有解决办法吗?我和你有同样的问题。但是我不能对你的帖子发表评论。所以请不要介意,因为这是一个问题

编辑:

我终于让它工作了。我不明白
manifest.json
中的flag
all_frames:true
不受影响。我需要编码为@serg:

chrome.tabs.executeScript(tabId, {allFrames:true, file:"content_script.js"})

谢谢大家,你能接受@serg的正确答案吗,杰罗姆?:-)

我创建了这个库:

简化浏览器选项卡、扩展的后台进程和iFrame之间的通信

我遇到的用例是:

  • 在一个iframe中执行操作
  • 结果应显示在备用iframe中

这样做可能会很痛苦,因此我构建了一个抽象。

这是您每次尝试访问的带有特定url的特定iframe吗?您希望访问什么?它的变量还是它的DOM?这是消息对话框窗口中的iframe。因此,url的变化取决于与我交谈的用户。iframe包含一个表,其中的行是我以前发送给用户的消息或他们以前发送给我的消息。iframe下面是我的回复的输入框。我想检查前面的消息,并在输入框中放置一个建议的回复,我将使用“原样”或根据需要进行修改。那么,将内容脚本注入此iframe,然后通过它进行通信怎么样?我喜欢这个想法,但我不知道如何做。到目前为止,我只知道如何使用chrome.tabs.executeScript注入脚本,但这会注入到选项卡中,而不是iframe中。是的,我确实让它工作了。塞格的答案是正确的。首先,检查iframe以查看它来自哪个位置。然后将您的脚本注入到主页面中,其中包含所有的_frames:true。您的脚本应该检查location href,如果找到正确的href,则应该继续,否则不会。
chrome.tabs.executeScript(tabId, {allFrames:true, file:"content_script.js"})