javascript google chrome扩展iframe无法检查contentWindow

时间:2011-08-27 06:22:13

标签: javascript iframe google-chrome-extension

我正在撰写Google Chrome扩展程序。现在我需要检查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内容并确定我之前在那里写的内容,以便我可以决定接下来要写什么。

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

3 个答案:

答案 0 :(得分:2)

我们的想法是将内容脚本注入此iframe,并使用它来获取所需信息。

据我所知,此框架具有预先知道的特定网址,因此您只需通过清单注入脚本(使用all_frames选项)。

如果由于某种原因你需要动态注入它,那么就有:

chrome.tabs.executeScript(tabId, {allFrames: true});

它将被注入父页面和iframe页面。然后在注入的内容脚本中,您可以检查它是否在右侧iframe内运行。例如,您的动态注入内容脚本可能如下所示(如果您注入它,虽然不需要清单URL检查):

if(window.location.href == "http://iframe.example.com/" && window != window.top) {
    //we are in the right page that is embedded as iframe, do stuff
} else {
    //do nothing
}

答案 1 :(得分:0)

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

编辑:

最后我开始工作了。我不明白,all_frames: true中的标记manifest.json不受影响。我需要编码为@ serg:

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

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

答案 2 :(得分:0)

我创建了这个库:

https://github.com/attachmentsme/Queuebert

简化浏览器标签,扩展程序的后台流程和iframe之间的通信。

我遇到的用例是:

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

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