Javascript 检测选项卡重复事件

Javascript 检测选项卡重复事件,javascript,google-chrome,google-chrome-extension,dom-events,chromium,Javascript,Google Chrome,Google Chrome Extension,Dom Events,Chromium,我正在开发一个Chrome扩展 我需要检测标签是否重复,我正在寻找标签检测事件,如onduplicate.addListener() Chrome扩展API是否可以实现这一点?这是最接近的实现: const newTabsId=new Set(); //观察所有具有开启器ID的新卡舌 chrome.tabs.onCreated.addListener(tab=>{ 若有(见开标一览表){ 新增选项卡id.add(选项卡id); } }); //等待一个新的标签 chrome.tabs.onUpd

我正在开发一个Chrome扩展

我需要检测标签是否重复,我正在寻找标签检测事件,如
onduplicate.addListener()


Chrome扩展API是否可以实现这一点?

这是最接近的实现:

const newTabsId=new Set();
//观察所有具有开启器ID的新卡舌
chrome.tabs.onCreated.addListener(tab=>{
若有(见开标一览表){
新增选项卡id.add(选项卡id);
}
});
//等待一个新的标签
chrome.tabs.onUpdate.addListener((tabId,changes,tab)=>{
如果(newTabsId.has(tabId)&&changes.status=='complete'){
如果(!制表符OpenerTab){
返回;
}
//检索开启器(原始)选项卡
getTabById(制表符OpenerTab)
.then(originalTab=>{
如果(
originalTab.url===tab.url&&//原始选项卡和新选项卡应具有相同的url
originalTab.index+1===tab.index&&//新选项卡应具有下一个索引
tab.active&&tab.selected//新选项卡应处于活动状态并处于选中状态
//此外,我们可能会比较从顶部滚动,但为此,我们需要使用内容脚本
) {
console.log('重复:',选项卡);
}
});
//从可观察列表中删除此选项卡
newtabid.delete(tabId);
}
});
//语法糖
函数gettabyid(id){
返回新承诺((解决、拒绝)=>{
chrome.tabs.get(id,resolve);
});
}
//清理内存:如果选项卡已关闭,则从可观察对象中删除
chrome.tabs.onRemoved.addListener(tabId=>{
newtabid.delete(tabId);
});

编辑1:但是现在没有明确的解决方案来检测真正的重复选项卡重复保留页面的
会话存储
,因此只需在每个页面的内容脚本中存储一些唯一的变量,并检查它是否出现在内容脚本的开头

舱单:

"content_scripts": [{
  "matches": ["<all_urls>"],
  "run_at": "document_start",
  "js": ["content.js"]
}],
背景/事件脚本:

if (sessionStorage[chrome.runtime.id]) {
  chrome.runtime.sendMessage({
    action: 'checkDup',
    tabId: Number(sessionStorage[chrome.runtime.id]),
  }, isDupe => {
    console.log(isDupe);
  });
} else {
  chrome.runtime.sendMessage({
    action: 'getTabId'
  }, tabId => {
    sessionStorage[chrome.runtime.id] = tabId;
  });
}
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  switch (msg.action) {
    case 'getTabId':
      sendResponse(sender.tab.id);
      return;
    case 'checkDup':
      chrome.tabs.get(msg.tabId, tab => {
        if (tab 
        && tab.index == sender.tab.index - 1 
        && tab.url == sender.tab.url) {
          sendResponse(true);
          console.log('Tab duplicated: ', tab, '->', sender.tab);
        }
      });
      return true; // keep the message channel open
  }
});

正如你在书中看到的,没有这样的事件。您必须尝试其他事件才能找到检查的组合。谢谢您的回复,您能向我详细解释一下“您必须尝试其他事件才能找到检查的组合”是什么意思你们有什么例子吗?实验的意思就是:为所有chrome.tabs事件声明并附加console.log-inside监听器,然后看看标签重复会有什么区别。不,我没有任何例子。我已经做过了,但没有解决方案?你似乎没有真正尝试过。复制的选项卡应该与前面的选项卡(选项卡
.index
属性)具有相同的URL,因此应该可以使用该URL和其他内容进行区分。这是一个好主意,我测试了它,但存在一个问题。。。当复制的选项卡处于活动状态并处于选中状态时,它会起作用,但是,当我们复制非活动的非选中选项卡时,它不会起作用:右键单击非活动选项卡。。无法复制:在我的电脑上,每个重复的选项卡都被选中,即使我在InActiveMMMM上使用了右键单击Ok,是否有办法在右键单击后强制选择或激活选项卡?我是说用铬extension@Devhercule nope@DeliazopenerTabId是当前处于活动状态的选项卡的id。因此,如果我右键单击一个不活动的选项卡并按duplicate(或使用API方法“chrome.tabs.duplicate”),那么OpenerTab将不正确,您的解决方案将无法工作。感谢您提供的代码,但它仍然存在一些错误:1/当我们多次复制选项卡时,它不起作用2/当我们复制选项卡1时,我们有了选项卡2,当我们复制tab2时,我们有tab3(但是在会话存储中tab3将tab1作为父级而不是tab2)3/当我们关闭tab1时,扩展不起作用,->在控制台中定义(因为tab1不存在),并且始终在会话存储中使用tab1(而不是tab2或teb3)。我希望我的描述很清楚,无论如何谢谢你的帮助:)这只是一个说明基本思想的例子。这取决于你解决所有这些边缘问题。我看没有理由不这样做。要有创造力和毅力。因为我是javascript的初学者,我会试试:)谢谢