Google chrome 无法将chrome.tabs.executeScript()调用到预加载的选项卡中。这是Chrome中的一个bug吗?
我只想知道我所描述的是Chrome的预期行为还是一个bug。 当您在omnibar中输入URL时,chrome会在后台预加载一个不可见的选项卡,并在用户点击enter时将其替换 内容脚本也会插入到预加载的选项卡中。我有一个内容脚本,其中包含一行:Google chrome 无法将chrome.tabs.executeScript()调用到预加载的选项卡中。这是Chrome中的一个bug吗?,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,我只想知道我所描述的是Chrome的预期行为还是一个bug。 当您在omnibar中输入URL时,chrome会在后台预加载一个不可见的选项卡,并在用户点击enter时将其替换 内容脚本也会插入到预加载的选项卡中。我有一个内容脚本,其中包含一行: chrome.runtime.sendMessage({ msg: 'init' }); 后台页面等待此消息,并将脚本动态加载到发送消息的选项卡中 chrome.runtime.onMessage.addListener( function(re
chrome.runtime.sendMessage({ msg: 'init' });
后台页面等待此消息,并将脚本动态加载到发送消息的选项卡中
chrome.runtime.onMessage.addListener(
function(request, sender) {
console.log('Loading script.js into frameId: ' + sender.frameId + ', tabId: ' + sender.tab.id);
chrome.tabs.executeScript(sender.tab.id, {
file: 'script.js',
frameId: sender.frameId,
runAt: 'document_start',
matchAboutBlank: true
});
}
)
后台页面还侦听选项卡替换事件
chrome.tabs.onReplaced.addListener(
function (addedTabId, removedTabId){
console.log('Tab id changed from ' + removedTabId + ' to ' + addedTabId);
}
);
script.js动态加载到大多数选项卡中,没有问题。但是,预加载的选项卡是一个问题,因为值sender.tab.id显然无效
下图显示了背景页的控制台
每行对应以下操作:
是的,只有用户确认导航时,该选项卡才会变为现实,在这种情况下,它会在onReplaced事件中报告,并在chrome.tabs API中可见。我想原因是,直到那一刻,它还没有成为一个内部标签所需要的东西。顺便说一句,在交换之前,此类选项卡的id始终为
-1
。是否有任何方法可以识别MessageSender是否属于预加载的选项卡?当我在onMessage回调中读取sender.tab.id时,我始终会获得该选项卡在变为实际选项卡时假定的id。然而sender.tab.index是-1。啊,是的,就是它!那是我记得的-1
。谢谢。这看起来像一个肮脏的黑客。。。但只要管用。