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

求助:在Manifest V3 Chrome扩展中用chrome.downloads API实现下载确认

解决方案:基于Chrome Downloads API的下载确认扩展

核心实现思路

Service Worker(background.js)负责捕获下载事件,通过创建独立弹窗获取用户确认,再根据用户操作决定是否允许下载。Content Script无需参与,因为下载事件只能在后台脚本中监听。

完整代码示例

1. manifest.json(权限配置)

需要申请downloads、downloads.shelf权限,同时注册Service Worker和弹窗页面:

{
  "manifest_version": 3,
  "name": "下载确认器",
  "version": "1.0",
  "permissions": ["downloads", "downloads.shelf"],
  "background": {
    "service_worker": "background.js"
  },
  "web_accessible_resources": [
    {
      "resources": ["confirm.html"],
      "matches": ["<all_urls>"]
    }
  ]
}

2. background.js(后台监听与弹窗控制)

监听downloads.onCreated事件,暂停下载,创建弹窗获取用户确认,再执行对应操作:

chrome.downloads.onCreated.addListener(async (downloadItem) => {
  // 跳过已取消或完成的下载
  if (downloadItem.state === "interrupted" || downloadItem.state === "complete") return;

  // 暂停当前下载
  await chrome.downloads.pause(downloadItem.id);

  // 创建确认弹窗(尺寸可自定义)
  const popupWindow = await chrome.windows.create({
    url: "confirm.html",
    type: "popup",
    width: 350,
    height: 200,
    focused: true
  });

  // 监听弹窗发送的消息
  const messageListener = (message, sender, sendResponse) => {
    if (sender.tab.windowId === popupWindow.id) {
      if (message.action === "allow") {
        // 允许下载:恢复并显示下载栏
        chrome.downloads.resume(downloadItem.id);
        chrome.downloads.show(downloadItem.id);
      } else if (message.action === "deny") {
        // 拒绝下载:取消并移除下载项
        chrome.downloads.cancel(downloadItem.id);
        chrome.downloads.erase({id: downloadItem.id});
      }
      // 关闭弹窗并移除消息监听
      chrome.windows.remove(popupWindow.id);
      chrome.runtime.onMessage.removeListener(messageListener);
    }
  };
  chrome.runtime.onMessage.addListener(messageListener);
});

3. confirm.html(确认弹窗页面)

简单的HTML页面,提供确认/取消按钮:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>确认下载</title>
  <style>
    body { padding: 20px; font-family: Arial, sans-serif; }
    .btn-container { margin-top: 20px; display: flex; gap: 10px; }
    button { padding: 8px 16px; cursor: pointer; border: none; border-radius: 4px; }
    #allowBtn { background: #4CAF50; color: white; }
    #denyBtn { background: #f44336; color: white; }
  </style>
</head>
<body>
  <p>是否确认下载此文件?</p>
  <div class="btn-container">
    <button id="allowBtn">确认下载</button>
    <button id="denyBtn">取消下载</button>
  </div>
  <script src="confirm.js"></script>
</body>
</html>

4. confirm.js(弹窗逻辑)

处理按钮点击,向后台发送消息:

document.getElementById('allowBtn').addEventListener('click', () => {
  chrome.runtime.sendMessage({action: 'allow'});
});

document.getElementById('denyBtn').addEventListener('click', () => {
  chrome.runtime.sendMessage({action: 'deny'});
});

关键说明

  • Service Worker不能直接操作DOM,但可以调用chrome.windows.create创建独立弹窗,弹窗拥有完整DOM环境。
  • 下载事件只能在后台脚本中通过chrome.downloads.onCreated监听,Content Script无法捕获这类全局事件。
  • 暂停下载是必须的,否则用户确认期间下载可能已经自动完成。
  • 确认完成后记得移除消息监听并关闭弹窗,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:01:28