Chrome扩展Manifest V2 嵌套iframe下content script未正确注入问题
问题原因
- 协议匹配遗漏:当前manifest中content script的匹配规则仅覆盖了http/https/file三种协议,如果
frameReportsiframe的src为blob、data等其他协议,会匹配失败无法注入。删除iframe后重新插入时触发了新的资源加载检查,此时注入逻辑生效,才能正常注入。 - 注入时机滞后:Manifest V2声明式content script默认注入时机为
document_idle,如果frameReportsiframe加载速度极快(比如是预加载资源、srcdoc内联内容),在注入逻辑触发前就完成了页面加载,会被Chrome跳过注入。 - 代码低级错误:提供的contentScript.js中事件绑定API写错,正确方法是
document.addEventListener而非document.addEventHandler,即使脚本成功注入也无法绑定点击事件,容易被误判为未注入。
修复方案
- 调整manifest匹配规则,同时提前注入时机:
"content_scripts": [ { "all_frames": true, "matches": ["<all_urls>"], "js": ["contentScript.js"], "match_about_blank": true, "run_at": "document_start" } ]
- 修复content script事件绑定代码:
document.addEventListener('click', function (event) { if (event.button == 0 && event.isTrusted) { var target = event.target; // 后续业务逻辑 } });
- 兜底动态注入方案:在background脚本中监听iframe加载事件,手动注入脚本避免遗漏,先在manifest中新增
webNavigation权限,再添加如下background代码:
chrome.webNavigation.onCommitted.addListener(details => { // 只处理非顶层frame if (details.frameId !== 0) { chrome.tabs.executeScript(details.tabId, { frameId: details.frameId, file: 'contentScript.js', runAt: 'document_start' }, () => void chrome.runtime.lastError); } }, { urls: ["<all_urls>"] });
内容的提问来源于stack exchange,提问作者Demodev
相关产品推荐
相关产品推荐

