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

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.alarms API设置定时任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:25:48