求助:在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
相关产品推荐
相关产品推荐

