Javascript 访问DOM元素数据文档->;Iframe->;Iframe->;方法铬扩展
我试图从开发人员控制台访问嵌套在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
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);
});
}