Chrome扩展开发:无事件通过JS获取网络打印机列表需用什么API?
嘿,我来帮你梳理下这个问题——你想在Chrome扩展里不依赖用户触发事件(比如点击按钮)就获取网络打印机列表,对吧?下面是具体的解决方案:
解决方案:使用Chrome扩展的
chrome.printing API 明确说:完全可以在无用户触发事件的情况下实现,但要依赖Chrome扩展专属的chrome.printing API(普通网页JS没有权限访问系统设备信息,做不到这点)。
关键步骤说明
1. 声明必要权限
在你的扩展manifest.json里必须添加对应权限(Chrome 100+支持更精细的printing.read权限,仅用于读取打印机信息;低版本用printing权限即可),示例配置:
{ "manifest_version": 3, "name": "打印机列表工具", "version": "1.0", "permissions": ["printing.read"], "background": { "service_worker": "background.js" } }
注:如果是旧版Manifest V2,把
service_worker替换成scripts数组即可。
2. 在后台脚本中无触发执行
扩展的后台脚本(service worker/background page)会在扩展启动时自动运行,你可以直接在脚本的顶层代码里调用API,完全不需要用户触发事件:
// background.js async function fetchNetworkPrinters() { try { // 获取所有可用打印机 const allPrinters = await chrome.printing.getPrinters(); // 筛选出网络打印机(isLocal为false即为网络打印机) const networkPrinters = allPrinters.filter(printer => !printer.isLocal); console.log("已获取网络打印机列表:", networkPrinters); // 可以把列表存入扩展存储,方便其他页面调用 await chrome.storage.local.set({ savedNetworkPrinters: networkPrinters }); } catch (err) { console.error("获取打印机列表失败:", err); } } // 扩展启动时自动执行,无需用户操作 fetchNetworkPrinters();
3. API细节补充
chrome.printing.getPrinters():返回Promise,resolve后得到打印机对象数组,每个对象包含name(打印机名称)、description(设备描述)、isLocal(是否本地设备)、uri(网络打印机的IPP地址)等核心字段。- 无触发执行的逻辑:后台脚本会在扩展安装完成、浏览器启动(若扩展设置为始终运行)时自动启动,代码会立即执行,完全不需要用户触发任何操作。
注意事项
- 该API仅适用于Chrome扩展,普通网页无法调用(网页没有系统设备访问权限)。
- 测试时需将扩展以「已解压的扩展程序」形式加载到Chrome中,并确认权限已正确声明。
- 若使用Manifest V3的service worker,它会在长时间闲置后被销毁,如果需要定期更新打印机列表,可以配合
chrome.alarmsAPI设置定时任务。
内容的提问来源于stack exchange,提问作者Ciro Baino
相关产品推荐
相关产品推荐

