我有一个扩展程序需要在其后台页面中加载包含大量重定向的页面。该网页到达已知网址(https://website.com/index.php)后,iframe的src
设置为about:blank
。
最后一页非常大,并且有大图像和所有不需要加载的内容,因此我不是连接到iframe的onload
事件,而是在100毫秒的时间间隔内设置以下函数:
function update(){
if(document.getElementsByTagName('iframe')[0].contentDocument.location.href == "https://website.com/index.php"){
console.log("Done!");
clearInterval(updateInterval);
document.getElementsByTagName('iframe')[0].src = "about:blank";
}
}
但是,只要iframe开始加载,update()就会抛出此错误:
不安全的JavaScript尝试使用URL访问框架 来自带框架的框架https://website.com/index.php 镀铬的扩展://hdmnoclbamhajcoblymcnloeoedkhfon/background.html。 请求访问的帧具有“chrome-extension”协议 被访问的帧具有“https”协议。协议必须匹配。
我尝试了catch()这个错误,但传递给Javascript的消息不出意外地不包含URL。页面重定向多次,因此了解确切的URL非常重要。 iframe的src
属性也不会更新以反映重定向。
答案 0 :(得分:8)
经过批次谷歌搜索并几乎放弃后,我想出了以下解决方案。它使用注入的内容脚本在加载正确的页面后将消息发送回扩展。
的manifest.json:
{
...
"background": {
"page": "background.html"
}, "content_scripts": [
{
"matches": ["http://website.com/index.php"],
"js": ["content.js"],
"all_frames": true,
"run_at": "document_start"
}
],
"permissions": [
"*://*.website.com/*"
]
}
background.html:
<html>
<head>
<script type="text/javascript" src="background.js"></script>
</head>
<body>
<iframe src="about:blank"></iframe>
</body>
</html>
background.js:
var waiting = false;
function login(){ // Call this function to start
var frame = document.getElementsByTagName('iframe')[0];
frame.src = "https://website.com/login/";
waiting = true;
}
function callback(){ // This gets called once the page loads
console.log("Done!");
}
chrome.extension.onMessage.addListener(function(request, sender, sendResponse){
if(request.loaded && waiting){
// If you used a pattern, do extra checks here:
// if(request.loaded == "https://website.com/index.php")
document.getElementsByTagName('iframe')[0].src = "about:blank";
waiting = false;
callback();
}
});
content.js:
chrome.extension.sendMessage({loaded: window.location.href});