【问题标题】:In background script, listen for newly opened tab在后台脚本中,监听新打开的选项卡
【发布时间】:2018-01-08 06:41:16
【问题描述】:

在我的后台脚本或除内容脚本之外的任何地方,我正在尝试侦听活动选项卡或新打开的选项卡。

我有这个,但这显然是不正确的:

我要做的是将内容脚本注入活动选项卡。我不希望我的内容脚本针对每个选项卡/窗口运行,只针对选定的选项卡。

有谁知道如何为某些选项卡注入内容脚本?我想不通。我认为注入内容脚本的最佳方式是从后台脚本中。

【问题讨论】:

    标签: javascript google-chrome-extension


    【解决方案1】:

    如果您想在已激活的选项卡 (chrome.tabs.query) 中运行代码:

    chrome.tabs.query({active: true, currentWindow: true}, function(foundTabs) {
        const activeTabId = foundTabs[0].id;
    
        chrome.tabs.executeScript(activeTabId, {
          file: 'inject.js'
        }); 
    })
    

    如果您想将文件注入每个新激活的选项卡 (chrome.tabs.onActivated):

    chrome.tabs.onActivated.addListener(function(activeInfo) {
        chrome.tabs.executeScript(activeInfo.tabId, {
            file: 'inject.js'
        }); 
    });
    

    请务必检查您是否已经注入文件,以防止多次注入。

    对于这两种情况,权限应包括tabs

    【讨论】:

    • 谢谢,我怎么知道最近点击了哪个标签?我可以监听标签点击吗?
    • @Olegzandr,我认为 chrome.tabs.onActivated 是正确的。不是吗?
    • 是的,我想是的,让我试试,如果它有效,将接受答案!
    • 顺便说一句,您在哪里看到 onActivated API 记录在案?我以前没见过
    • @Olegzandr,我把链接放在我的答案中。
    【解决方案2】:

    我错过了:

     "webNavigation"
    

    manifest.json 中的权限。添加该权限后,我现在拥有:

    chrome.webNavigation.onDOMContentLoaded.addListener(function (details) {
    
        const tabId = details.tabId;
    
        chrome.tabs.executeScript(tabId, {
          file: 'inject.js'
        });
    
    });
    

    现在可以了。

    【讨论】:

    • 如果有更好的方法来确定活动标签而不用轮询,请告诉我
    【解决方案3】:

    在这种情况下,我们无法在内容脚本中访问的某些 chrome API 在 background.js 中执行该代码并从后台 js 执行相应的操作。如果您想在内容脚本中执行某些操作,则需要使用发送消息进行通信

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2013-06-18
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2013-10-29
      • 2015-02-15
      • 2014-03-27
      相关资源
      最近更新 更多