You need to enable JavaScript to run this app. Chrome扩展开发:如何实现指定网站加载120秒后发送桌面通知?
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展开发:如何实现指定网站加载120秒后发送桌面通知?

Chrome扩展实现「指定网站加载完成120秒后触发桌面通知」调整方案

核心问题说明

你当前的逻辑缺陷是定时任务和网页加载状态完全脱钩,不需要重写已经完成的通知样式、alarm基础逻辑,只需要补全「加载状态监听」「标签与定时任务绑定」「无效任务清理」三个链路,就能精准实现需求,以下是具体的配置调整方案:

一、manifest.json 配置调整

按照Chrome扩展V3的规范,需要补充必要的权限和入口配置,核心改动点:

  • 保留已实现功能用到的alarms、notifications权限
  • 新增tabs权限,用于读取标签页加载状态、监听标签生命周期事件
  • 在host_permissions中精准声明需要监控的目标站点,避免申请全量网页权限
  • 配置service worker入口,指向你的background.js文件
    可参考的基础配置结构:
{
  "manifest_version": 3,
  "name": "站点停留提醒扩展",
  "version": "1.0",
  "permissions": ["alarms", "notifications", "tabs"],
  "host_permissions": ["https://*.xyz.com/*"],
  "background": {
    "service_worker": "background.js"
  }
}

二、background.js 逻辑调整

整体逻辑链路为:监听到目标站点标签加载完成 → 为该标签单独创建120秒定时任务 → 定时触发时校验标签状态 → 状态匹配则发送通知,标签关闭/跳走则提前清除定时任务,避免误发、重复发通知。
具体代码模块:

  1. 监听标签加载完成事件,建立标签与定时任务的绑定关系
    // 监听标签页状态更新
    chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
      // 仅当标签页彻底加载完成、URL匹配目标站点时触发计时
      if (changeInfo.status === 'complete' && tab.url?.includes('xyz.com')) {
        // 清除该标签之前可能残留的旧定时任务,避免重复计时
        await chrome.alarms.clear(`site_reminder_${tabId}`);
        // 新建120秒(2分钟)定时任务,名称绑定对应标签ID
        chrome.alarms.create(`site_reminder_${tabId}`, {
          delayInMinutes: 2
        });
      }
      // 标签加载完成后跳转到非目标站点,立即清除对应定时任务
      if (changeInfo.status === 'complete' && tab.url && !tab.url.includes('xyz.com')) {
        await chrome.alarms.clear(`site_reminder_${tabId}`);
      }
    });
    
  2. 监听标签关闭事件,清理无效定时任务
    // 标签被关闭时,清除对应绑定的定时任务
    chrome.tabs.onRemoved.addListener(async (tabId) => {
      await chrome.alarms.clear(`site_reminder_${tabId}`);
    });
    
  3. 调整原有alarm触发逻辑,加状态校验后再发通知
    // 监听定时任务触发
    chrome.alarms.onAlarm.addListener(async (alarm) => {
      // 跳过非本站点提醒类的定时任务
      if (!alarm.name.startsWith('site_reminder_')) return;
      // 从定时任务名称中提取关联的标签ID
      const targetTabId = Number(alarm.name.replace('site_reminder_', ''));
      try {
        // 校验对应标签的当前状态
        const targetTab = await chrome.tabs.get(targetTabId);
        // 标签仍在目标站点,就触发你已写好的通知逻辑
        if (targetTab.url?.includes('xyz.com')) {
          chrome.notifications.create({
            type: 'basic',
            iconUrl: '你的通知图标路径.png',
            title: '站点停留提醒',
            message: '你已在目标站点停留满120秒'
          });
        }
      } catch (err) {
        // 标签不存在时,清除无效的定时任务
        await chrome.alarms.clear(alarm.name);
      }
    });
    

新手容易踩的坑

  • 不要使用setTimeout实现120秒计时:Chrome V3的service worker会在闲置时自动休眠,setTimeout会被中断,只有chrome.alarms能在休眠后依然准点触发
  • 不要给所有标签共用同一个定时任务:一定要把定时任务名称和标签ID做绑定,否则多标签打开目标站点时会出现计时混乱、通知重复的问题
  • URL匹配规则要根据实际站点调整,避免过严导致漏触发、过松导致误触发(比如只匹配字段片段可能会误匹配到其他无关站点)

内容的提问来源于stack exchange,提问作者Abhishek Wagh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 12:15:06