gpt4 book ai didi

javascript - 为什么我的 Chrome 扩展中从未收到过 onCreated 事件的选项卡会收到 webNavigation.onCompleted 事件?

转载 作者:行者123 更新时间:2023-11-30 08:33:48 27 4
gpt4 key购买 nike

我正在尝试为 Chrome 编写一个扩展程序,以密切跟踪打开的各个选项卡。不过,似乎新标签不断凭空出现。这是怎么回事?

这是一个非常简单的背景页面,说明了我在说什么:

(function () {
'use strict';

var tabKeeper = {};

function logError(tabId) {
if (!tabKeeper[tabId]) {
console.log('Tab ' + tabId + ' not found!');
console.log(JSON.stringify(tabKeeper));
tabKeeper[tabId] = true;
}
}

chrome.tabs.onCreated.addListener((tab) => {
console.log('Tab created: ' + tab.id);
tabKeeper[tab.id] = true;
});

chrome.webNavigation.onCompleted.addListener((details) => {
console.log('Navigation complete: ' + details.tabId);
logError(details.tabId);
});

chrome.tabs.query({}, (tabs) => {
if (!tabs) { return; }
tabs.forEach((tab) => {
console.log('Tab found at startup: ' + tab.id);
tabKeeper[tab.id] = true;
});
});

})();

重现行为的步骤(Chrome 47.0.2526.73):

  • 启动 Chrome
  • 创建一个新标签
  • 在新标签页的地址栏中输入“abc”(后面有一个空格)

这是我在控制台日志中看到的内容:

Tab found at startup: 2
Navigation complete: 2
Tab created: 4
Navigation complete: 4
Navigation complete: 4
Navigation complete: 6
Tab 6 not found!
{"2":true,"4":true}

这似乎是非常可重复的。什么是选项卡 6?它从哪里来的?为什么我在创建事件时没有收到事件?

最佳答案

这是由于 Chrome 预呈现 功能。当您在地址栏中输入地址时,在您真正打开选项卡之前,它会呈现为一个隐藏选项卡,当您按下回车键时该选项卡就会显示出来。内容脚本和您的 chrome 扩展程序也对这些隐藏的选项卡有效。通过在任何用户实际访问内容之前准备好内容,它基本上可以加快流程以获得更好的用户体验。更多详情 here .

同时了解任何页面的可见性状态如何变化将非常有助于理解调用这些事件的原因。

这是触发事件但选项卡尚未打开且对您不可见的基本原因。同样在 prerendering 的情况下,即当可见性状态发生变化时,不会调用 chrome.tabs.onCreated.addListener() 而是调用另一个名为 chrome.tabs 的监听器。 onReplaced() 被调用。有关页面可见性状态的更多详细信息 here .

关于javascript - 为什么我的 Chrome 扩展中从未收到过 onCreated 事件的选项卡会收到 webNavigation.onCompleted 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com