我正在编写一个 Chrome 扩展,它创建一个新选项卡,然后注入一个脚本来覆盖它的整个 HTML。 (一些背景知识可以参考另一篇文章:Chrome扩展服务工作者将脚本注入新的about:blank选项卡)。这是脚本:
let openedTab = await chrome.tabs.create({active: false, url: randomURL});
openedTabID = openedTab.id;
let writeHTML = function (strHTML) {
stop();
//document.open();
document.write(strHTML)
//document.close();
}
chrome.scripting.executeScript({target : {tabId : openedTabID}, func : writeHTML, injectImmediately: true, args: [newTabHTML[0].result]});
我发现strHTML无法成功写入它,页面保持空白(由于加载停止而空白),除非我不
stop()
加载页面。如果我不 stop()
它,strHTML 可以覆盖页面,但只有选项卡图标不断旋转(加载)。我觉得这很烦人,我担心原始页面(url: randomURL
)最终会被加载并影响我之后的预期操作。所以我想问一下,在我向页面写入 HTML 之前,如何才能真正停止页面的加载?
这是我尝试过的一些故障排除......
我尝试手动将
document.write("asdasd")
放入控制台,没有观察到变化,但只返回undefined
,但也没有错误。
我尝试在加载的html标签之间手动输入
asdasadasdsd
,也没有观察到变化。如果我 stop()
页面,则显示似乎未与 html 代码链接。
我不太确定这是否是由于原始页面是一个angularJS页面,好像我
stop()
立即加载我注入脚本,加载的HTML是
<html ng-app="ansd" ng-controller="ApplicationController as AppCtrl"></html>
但是如果我在页面加载后进入控制台,我可以
document.write("asdasd")
覆盖页面。
即使我在
document.documentElement.remove();
之后添加 stop()
来删除整个 HTML(是的,删除成功),我仍然无法 document.write("asdasd")
。
这是由于 javascript 问题还是 Chrome 的问题,还是我的问题?请帮忙。非常感谢。
延迟
stop
似乎有效:
let writeHTML = function (strHTML) {
setTimeout(stop);
document.write(strHTML)
}
更可靠的解决方法可能是打开一个包含扩展页面的选项卡,以便它使用后台脚本中的数据进行自身修改。