Chrome扩展如何判断标签页权限后再通过executeScript注入脚本
解决方法
你可以通过chrome.permissions.contains()接口提前校验对应标签页的域名访问权限,同时添加上下文的错误兜底逻辑,即可避免未处理的运行时报错。
完整修改后代码
const chromeManifest = chrome.runtime.getManifest(); chrome.tabs.query({}, tabs => { const [script] = chromeManifest?.content_scripts?.[0].js || []; if (!script) return; tabs.forEach(async tab => { // 过滤浏览器内部页面、无URL的特殊标签页,这类页面本身不允许扩展注入脚本 if (!tab.url || tab.url.startsWith('chrome://') || tab.url.startsWith('edge://') || tab.url.startsWith('about:')) return; // 校验扩展是否拥有当前标签页对应域名的访问权限 const hasPermission = await chrome.permissions.contains({ origins: [new URL(tab.url).origin + '/*'] }); if (hasPermission) { chrome.tabs.executeScript(tab.id, { file: script, }, () => { // 兜底捕获所有运行时异常,覆盖校验后标签页URL变更等极端场景 if (chrome.runtime.lastError) { console.log('当前标签页注入失败:', chrome.runtime.lastError.message); } }); } }); });
相关说明
- 如果你使用的是Manifest V3版本,
chrome.tabs.executeScript接口已被官方弃用,需要替换为chrome.scripting.executeScript,同时需要在manifest.json的permissions字段中额外声明"scripting"权限。 - 上述权限校验逻辑对manifest中静态声明的权限、运行时动态申请的权限均生效。
- 必须保留回调中的
chrome.runtime.lastError判断,即使提前做了权限校验,也可能存在标签页URL在判断和注入的间隙发生变化等极端情况,避免抛出未捕获的运行时错误。
内容的提问来源于stack exchange,提问作者Ballon Ura
相关产品推荐
相关产品推荐

