我试图动态注入内容脚本,因此我使用了记录的chrome.tabs.executeScript
方法。
然而,与嵌入式内容脚本(在清单中定义)不同,动态脚本是随机运行的,而我需要确保它每次都运行。
基本上我在后台脚本中监听制表符更新事件,并在每个"loading"
事件上执行动态内容脚本
我注意到的是,行为似乎与页面/脚本加载时间有关 - 如果在脚本执行之前页面加载完成,脚本将无法运行,否则它似乎按预期工作
虽然这只是基于观察的猜测,如果您对此发生了什么其他想法,请随时分享您的想法。
有没有办法确保动态脚本在任何情况下都能100%执行?
以下是脚本不运行的日志序列:
loading: changeInfo = {status: "loading"}
loading: start. sender.tab.id = 1454
loading: start script loading
loading: code size = 4190306 bytes
loading: changeInfo = {status: "complete"} <- page loading completed
loading: time to execute script = 945 <- script execution completed
以下是代码段:
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
console.log("loading: changeInfo = ", changeInfo)
if (changeInfo.status !== "loading") {
console.log("loading: skip");
return;
}
console.log("loading: start. sender.tab.id = ", tabId)
console.log("loading: start script loading")
var timerStart = Date.now();
console.log("loading: code size = ", byteCount(scriptCode), " bytes")
chrome.tabs.executeScript(tabId,
{
code: scriptCode,
runAt: "document_idle"
}, function (response) {
console.log("loading: time to execute script = ", Date.now() - timerStart)
var err = chrome.runtime.lastError;
console.log("loading: response = ", response, ", err = ", err)
});
});
日志中也没有错误
要添加的另一件事 - 如果我在chrome.tabs.executeScript
中将setTimeout
包裹起来的时间延迟为2000毫秒,则此保证脚本将从不运行,这表示时间问题。
答案 0 :(得分:0)
好吧,这很愚蠢 - 问题似乎出现在动态脚本代码本身中:主要逻辑是在onload
回调中执行的,如果脚本在onload
之后加载,则永远不会运行:
window.addEventListener("load", mainLogic, false);
删除回调并运行mainLogic()
直接修复了问题。
我会把它留在这里,万一有人犯了与我一样的错误。