chrome.browserAction.setBadgeText(object details)
用于设置Chrome扩展程序的徽章文字。但是,如果tabId不存在,Chrome会使用console.error()
产生以下错误:
运行browserAction.setBadgeText时未经检查的runtime.lastError:没有带id的标签:####。
在页面加载期间设置徽章文本时,这会成为问题。如果该标签最初存在但被用户关闭,则setBadgeText
最终会使用不存在的tabId
进行调用。
通常,可以通过检查有问题的函数as was answered in another question的回调参数中的chrome.runtime.lastError
来防止这种情况。但是,由于browserAction.setBadgeText()
没有回调参数,因此似乎无法阻止错误。
当tabId
是不表示任何选项卡的整数时,以下代码仍会产生错误,即使它尝试...
try...catch
捕获错误(由于未引发console.error()
,因此无法正常工作)。lastError
后检查setBadgeText
(由于该功能是异步的,因此无法正常工作)。setTimeout
之后使用各种lastError
时间间隔检查setBadgeText
(这不起作用且可能不可靠) setBadgeText
添加一个回调参数(由于没有第二个参数,因为chrome在使用时会产生另一个错误,因此已被注释掉)。var tabId = 5000;
function clearError () {
console.log(chrome.runtime.lastError);
}
try {
chrome.browserAction.setBadgeText({
text: 'text',
tabId: tabId
}/*, clearError*/);
clearError();
setTimeout(clearError, 0);
setTimeout(clearError, 50);
setTimeout(clearError, 500);
}
catch (e) {
console.log('Caught', e);
clearError();
}
有没有办法正确检查chrome.runtime.lastError
以防止发生此错误?
答案 0 :(得分:6)
一个选项是首先调用chrome.tabs.get,如果没有调用错误,则假设该选项卡将在接下来的几毫秒内存在。
var tabId = 5000;
function callback(tab) {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message);
} else {
chrome.browserAction.setBadgeText({
text: 'text',
tabId: tabId
});
}
}
chrome.tabs.get(tabId, callback);
当然,在tabs.get
整理和setBadgeText
被调用之间,标签总是有可能被关闭,但这种可能性很小。
答案 1 :(得分:1)
除了如上所述的chrome.tabs.get()
之外,您还可以搭载现有的browserAction方法,该方法接受回调以捕获错误。例如:
var tabId = 5000;
chrome.browserAction.getTitle({tabId: tabId}, function(result) {
if (chrome.runtime.lastError) return;
// The coast is clear...
chrome.browserAction.setBadgeText({
text: 'text',
tabId: tabId
});
});
好消息:chrome.browserAction.setBadgeText()
还应支持chrome.browserAction.getTitle()
之类的回调函数,根据one source从Chrome 67开始。手指交叉!
答案 2 :(得分:0)
此问题已报告错误,并已标记为已修复:https://crbug.com/451320