stop()后无法进行document.write

问题描述 投票:0回答:1

我正在编写一个 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 的问题,还是我的问题?请帮忙。非常感谢。

javascript google-chrome-extension
1个回答
0
投票

延迟

stop
似乎有效:

let writeHTML = function (strHTML) {
    setTimeout(stop);
    document.write(strHTML)
}

更可靠的解决方法可能是打开一个包含扩展页面的选项卡,以便它使用后台脚本中的数据进行自身修改。

© www.soinside.com 2019 - 2024. All rights reserved.