Javascript 访问DOM元素数据文档->;Iframe->;Iframe->;方法铬扩展

Javascript 访问DOM元素数据文档->;Iframe->;Iframe->;方法铬扩展,javascript,google-chrome,iframe,google-chrome-extension,Javascript,Google Chrome,Iframe,Google Chrome Extension,我试图从开发人员控制台访问嵌套在iframe中的iframe中的一些数据: Object.keys(document.getElementById("contentBody"). contentDocument.getElementById('rawContent'). contentDocument.defaultView.window.messages) ["29c736c0ed25463c8436f4990ab6c6ec.zip", "235819a8cf11488e83f0

我试图从开发人员控制台访问嵌套在iframe中的iframe中的一些数据:

Object.keys(document.getElementById("contentBody").
  contentDocument.getElementById('rawContent').
  contentDocument.defaultView.window.messages)

["29c736c0ed25463c8436f4990ab6c6ec.zip", 
 "235819a8cf11488e83f0336603b71711.zip", 
 "66c9260590834d9698568c8a676ef406.zip", 
 "fae95e31cb424cd6ad21302217ef2cdc.zip", 
 "f554f712141047aa9aa24f765073e305.zip", 
 "e5c41819578240e0868f43ab6301aeb3.zip"]
这正是我所期待的,但我试图从我正在开发的google chrome扩展中获得相同的信息,由于某些原因,我无法访问消息数组,这是manifest文件和contentscript.js(我尝试了我想到的一切,搜索了几个小时都没有成功:/):

content.js

var iframeContentBody = document.getElementById('contentBody');
var innerDocContentBody = iframeContentBody.contentDocument;
var iframeRawContent = innerDocContentBody.getElementById('rawContent');
var innerDocRawContent = iframeRawContent.contentDocument; // iframeRawContent is undefined here
console.log(iframeRawContent.messages);  // this prints undefined
舱单:

{                                                                                                                                                                                                                  
  "manifest_version": 2,                                                                                                                                                                                           

  "name": "Read Comments",
  "description": "Read all comments from the current forum",
  "version": "1.0",
  "content_scripts": [{
    "matches": ["*://*.forum.net/*"],
    "js": ["content.js"]
  }],
 "browser_action": {
   "default_title": "Read Comments"
 },
 "permissions": ["activeTab", "tabs"]
} 
GIST要设置所有内容:

下载这3个文件并将其放入同一文件夹后,运行以下操作:

python -m SimpleHTTPServer 80 # You may need to run it with sudo 
然后转到localhost/test.html,一切就绪,如果您测试我在控制台中发布的行,您应该会看到[1,2,3]

这是分机码

开发者控制台:

带有“所有框架”的Chrome扩展:真

黑客解决方案: 在这个要点中,有一种方法可以做到这一点,很难检测到iframe何时已加载,也很难检测到另一个iframe中的iframe何时已加载,因此setTimeout提供了足够的时间来完成,然后在dom中添加一个脚本元素似乎绕过了chrome扩展可能具有的所有安全措施,并且它确实在没有任何其他问题的情况下获取了属性的内容,但这似乎有点骇人听闻,这不是我想要做的,我正在寻找一个干净的解决方案或一种干净的方法来访问嵌套iframe的dom,正如示例代码所述


谢谢,欢迎您提出任何建议。

这毕竟是我的解决方案,从我们讨论的评论到我对文档和其他线程的研究:

内容脚本:

(function () {
  document.addEventListener("DOMContentLoaded", function () {
    contentBody = document.getElementById("contentBody");
    contentBody.addEventListener("load", function () {
      rawContent = contentBody.contentDocument.getElementById("rawContent");
      if (rawContent) {
        var s = document.createElement("script");
        s.src = chrome.extension.getURL('injected.js');
        s.onload = function() {
          this.parentNode.removeChild(this);
        };

        (document.head||document.documentElement).appendChild(s);
      }
    });
  });
})();
注入文件:

keys = Object.keys(document.getElementById("contentBody").contentDocument.getElementById("rawContent").contentDocument.defaultView.window.messages);

console.log(keys);
舱单:

{
  "manifest_version": 2,

  "name": "Read Comments",
  "description": "Read all comments from the current forum",
  "version": "0.0.1",

  "content_scripts": [{
    "matches": ["*://localhost/*"],
    "run_at": "document_start",
    "js": ["content.js"]
  }],

  "browser_action": {
    "default_title": "Read Comments"
  },

  "permissions": [
  ],

  "web_accessible_resources": ["content.js", "injected.js"]
}

作为一个简单的解释,主要问题是iFrame的异步加载和扩展代码运行的时刻,因此在侦听了大量事件并丢弃了dom上没有所需元素的事件后,一切都很顺利…

为了完整性,这里有一个版本带有
“所有帧”:true
。有两个问题需要解决:(1)从内部框架到顶部获取
消息
,(2)从网页的孤立世界到内容脚本的孤立世界获取
消息
(我假设您不只是想将
消息
写入控制台)。这可以通过使用一次解决这两个问题


我必须承认我还没有真正测试过。您可能需要尝试创建注入脚本。

我曾尝试在JSFIDLE中创建一个示例,但我陷入了iframe疯狂:/I假设这意味着
innerDocContentBody
已定义?你有没有考虑过让你的内容脚本运行在
“所有框架”:true
中,并确定你是否在正确的框架中?它应该运行在主框架上,我尝试了所有框架,但看到了更多的错误,是的,已经定义好了,idk我怎样才能为它提供一个测试环境找到了一种方法:在下载这3个文件并将其放在同一个文件夹中之后,运行这个:python-m SimpleHTTPServer,然后转到localhost:8000/test.html,您就都设置好了,如果您测试我在控制台中发布的行,您应该会看到[1,2,3],这将是扩展代码
if ( window.top !== window.parent ) {
    var s = document.createElement("script");
    s.textContent = "postMessage(messages,'*');";
    s.onload = function() {
        this.parentNode.removeChild(this);
    };
    document.head.appendChild(s);
} else if ( window.top === window ) {
    addEventListener('message',function(e) {
        console.log(e.data);
    });
}