【发布时间】:2023-03-14 16:41:01
【问题描述】:
我正在通过 chrome.tabs.executeScript(在 document_end)将脚本注入网页。我确信脚本在语法上是好的,并且清单中的权限是好的。大多数情况下 (>99%) 一切都很好,脚本会做它应该做的事情并返回它应该做的事情。
但有时结果(通过回调获得)是一个空数组。什么时候会发生这种情况?
我注意到我在选项卡仍在加载时调用了 executeScript API(但同样,大部分时间它都有效)。如果我一次又一次地重试注入相同的脚本,最终,经过几次重试,它会返回它应该返回的内容。但我不知道如何判断失败的尝试是被执行了还是没有返回任何东西。
编辑: 这是一个代码示例:
var debugInjectResultProblem = function(tabId, callback) {
chrome.tabs.executeScript(tabId, {code: 'Date.now()', runAt: 'document_end'}, function(result) {
if (chrome.runtime.lastError) {
console.error('Real error: ', chrome.runtime.lastError);
callback();
return;
}
console.log('Result is ', result);
if (!result || result.length === 0) {
debugInjectResultProblem(tabId, callback);
} else {
callback();
}
})
};
//... the tab gets reloaded here with different URLs couple of times
//... now inside a tab updated event handler
//... the code variable normally contains the script which is quite long
//... but the problem happens even if I do:
code = 'Date.now()';
chrome.tabs.executeScript(tabId, {code: code, runAt: 'document_end'}, function(retVal) {
if (chrome.runtime.lastError) {
console.error('Error executing script: ' + chrome.runtime.lastError.message);
}
else if (!retVal || !retVal[0]) {
console.error('Unexpected executeScript retVal: ' + JSON.stringify(retVal));
debugInjectResultProblem(tabHandle, function() { console.log('Done'); });
}
else {
console.log('OK, result is:', retVal[0]);
}
});
同样,99% 的情况下都可以。然后突然输出变成这样:
Unexpected executeScript retVal: []
Result is []
Result is []
Result is [1421783140122]
Done
【问题讨论】:
-
向我们提供任何代码可能有用吗?我们可以猜测,但这不是猜测。
-
结果列表很少是空数组。结果列表为空通常表示竞争条件或 Chrome 中的错误。您能否编辑您的问题并显示触发此错误的代码和说明?
-
好的,很抱歉所有为我做 OT 的人没有给出代码示例。我的代码相当冗长。我试图缩短它,但是我无法重现该行为。这就是为什么我只是问了一般问题,是否可以出于任何原因返回 []。感谢 rob-w 的回复。其他人,再次抱歉。
-
投票支持重新开放,但我认为@RobW 需要看看。
-
哦,我能想到一个原因。如果标签页在
document_end触发之前离开怎么办?
标签: javascript google-chrome-extension