You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展:如何跨窗口监听活动标签页切换并检测浏览器窗口焦点变化

检测Chrome窗口焦点切换并获取当前活动标签URL

嗨,这个问题我之前也碰到过!chrome.tabs.onActivated确实只负责同一窗口内的标签切换,窗口级别的焦点变化得用另一个API来处理。下面是具体的解决方法:

核心思路

要监听窗口焦点切换,我们需要用到chrome.windows.onFocusChanged事件,当用户切换Chrome窗口(或者Chrome失去焦点到其他应用)时,这个事件会被触发。然后结合chrome.tabs.query就能拿到当前活动窗口的活动标签URL了。

完整实现步骤

1. 配置扩展权限

首先确保你的manifest.json里声明了tabs权限,不然无法获取标签信息:

{
  "manifest_version": 3,
  "name": "Window Focus Tracker",
  "version": "1.0",
  "permissions": ["tabs"],
  "background": {
    "service_worker": "background.js"
  }
}

(如果是Manifest V2的话,把service_worker改成scripts就行)

2. 编写监听逻辑

在你的背景脚本(比如background.js)里添加以下代码:

// 监听窗口焦点变化
chrome.windows.onFocusChanged.addListener((windowId) => {
  // windowId为-1表示Chrome失去焦点(切换到其他应用),可根据需求忽略
  if (windowId === chrome.windows.WINDOW_ID_NONE) {
    console.log("Chrome窗口失去焦点啦");
    return;
  }

  // 查询当前焦点窗口的活动标签
  chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
    if (tabs.length > 0) {
      const activeTab = tabs[0];
      console.log("当前活动标签URL:", activeTab.url);
      // 这里可以添加你的业务逻辑,比如存储URL、发送到其他地方等
    }
  });
});

// 保留原有标签切换监听(如果需要处理同一窗口内的切换)
chrome.tabs.onActivated.addListener((activeInfo) => {
  chrome.tabs.get(activeInfo.tabId, (tab) => {
    console.log("同一窗口内切换标签,URL:", tab.url);
  });
});

代码说明

  • chrome.windows.onFocusChanged的回调参数windowId是当前获得焦点的窗口ID,当Chrome整体失去焦点时会返回chrome.windows.WINDOW_ID_NONE(也就是-1),你可以根据需求决定是否处理这种情况。
  • chrome.tabs.query({ active: true, currentWindow: true })会返回当前焦点窗口里的活动标签数组,因为同一窗口只有一个活动标签,所以取数组第一个元素即可。
  • 如果你同时需要处理同一窗口内的标签切换,保留原来的chrome.tabs.onActivated监听,并通过chrome.tabs.get获取标签信息(因为activeInfo里只有tabId,没有URL)。

这样不管用户是切换窗口还是同一窗口内的标签,你都能准确获取到当前活动标签的URL啦!

内容的提问来源于stack exchange,提问作者Jeanluca Scaljeri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:29:04