浏览器扩展中JS创建的Button背景图在普通网页无法生效如何解决?
问题原因
- 路径解析错误:你当前代码里的
url(/48.png)是相对站点根路径的相对路径,在扩展自身的HTML页面运行时,根路径对应扩展包的根目录,所以可以正常加载;但注入到第三方站点(如Twitter)时,路径会被解析为当前站点根路径下的资源,也就是https://twitter.com/48.png,该资源不存在自然无法显示。 - 扩展资源访问限制:浏览器的扩展安全策略默认禁止第三方站点上下文直接访问扩展包内的本地资源,即使你写对了扩展资源的绝对路径,没有配置对应权限也会被拦截。
修复方案
你不需要退回img方案,现有方案可以直接修复,操作如下:
- 替换资源路径为扩展的绝对路径
调用浏览器扩展提供的runtime.getURLAPI获取资源的真实访问路径,修改代码如下:
let dropDownButton = document.createElement('button'); // 替换原有background赋值逻辑 const iconUrl = chrome.runtime.getURL('48.png'); dropDownButton.style.background = `url(${iconUrl})`; dropDownButton.style.width = size + "px"; dropDownButton.style.height = size + "px"; given.append(dropDownButton);
如果使用的是Manifest V3版本的扩展,也可以用browser.runtime.getURL兼容跨浏览器场景。
- 配置manifest开放资源访问权限
在你的manifest.json中添加web_accessible_resources配置,开放48.png的访问权限:
如果是Manifest V3版本:
{ "web_accessible_resources": [ { "resources": ["48.png"], "matches": ["*://*.twitter.com/*"] // 按需指定允许访问的站点,最小权限原则更安全,也可以填<all_urls>适配所有站点 } ] }
如果是Manifest V2版本:
{ "web_accessible_resources": ["48.png"] }
关于img方案的说明
如果你后续需要更灵活控制图片的缩放、对齐、加载状态,也可以选择button内部嵌套img的方案,同样遵循上述两个规则:img的src属性赋值为runtime.getURL返回的路径,且在manifest中配置资源访问权限即可,两种方案都可以稳定运行。
内容的提问来源于stack exchange,提问作者Emu_Flock
相关产品推荐
相关产品推荐

