我有一个contentscript,它本质上是做一个console.log来指示它已经被注入到页面中,而我的manifest.json将all_frames设置为true。
因此,如果我去http://www.reddit.com/r/videos我每帧都会看到一条消息,如果我点击视频,我还会看到一条来自注入视频iframe的脚本的消息。这向我表明,如果页面被动态修改为包含iframe,那么contentscript就会被注入其中
当我去http://www.html5video.org,我只从一帧中得到一条消息,但如果我查看DOM,我会发现视频有一个iframe,所以我希望将我的内容脚本注入其中,但事实并非如此。
我的最终目标是在页面上获得视频的选择器,我希望能够通过将查找它的代码注入iframe来实现这一点。
感谢您的帮助。
我怀疑Chrome会将您的内容脚本注入到IFRAME中,该IFRAME是原始页面源的一部分,reddit.com的例子就是这样——IFRAME也是原始页面的一部分。对于html5视频链接,IFRAME不是原始源的一部分。但是,如果您检查元素,您可以看到IFRAME,这向我表明IFRAME已动态加载到DOM中。我在我写的扩展中看到了同样的行为,所以它看起来是一致的。
如果您需要注入IFRAME,那么也许您可以挂接DOM创建事件并采取您需要的操作:
document.addEventListener('DOMNodeInserted', onNodeInserted, false);
更新:
这个干什么http://html5video.org/-使用以下content_script代码,我可以获得IFRAME,然后获得VIDEO标记。注意:这种方法/概念也应该适用于Reddit。
content_script.js
console.log("content script for: " + document.title);
var timer;
document.addEventListener('DOMNodeInserted', onNodeInserted, false);
function onNodeInserted(e)
{
if(timer) clearTimeout(timer);
timer = setTimeout("doSomething()", 250);
}
function doSomething()
{
$media = $(".mwEmbedKalturaIframe");
console.log($media);
$video = $media.contents().find("video");
console.log($video);
}
manifest.json
{
// Required
"name": "Foo Extension",
"version": "0.0.1",
// Recommended
"description": "A plain text description",
"icons": { "48": "foo.png" },
//"default_locale": "en",
// Pick one (or none)
"browser_action": {
"default_icon": "Foo.png", // optional
"default_title": "Foo Extension" // optional; shown in tooltip
},
"permissions": [ "http://*/", "https://*/", "tabs" ],
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["jquery-1.7.1.min.js", "content_script.js" ],
"run_at": "document_idle",
"all_frames": true
}
]
}
另请参阅:jQuery/JavaScript:访问iframe 的内容