我正在处理背景chrome扩展,并发现我无法将js或css插入到特定的框架中。根据当前的chrome.tabs API文档https://developer.chrome.com/extensions/tabs#method-executeScript:
如果allFrames为true,则表示应将JavaScript或CSS注入当前页面的所有帧。默认情况下,它为false,仅注入顶部框架。如果设置为true且设置了frameId,则代码将插入所选框架及其所有子框架中。
我有一个有效的frameId用于调用,但无论details.frameId
中设置的是什么,调用都会失败并出现以下错误:
chrome.tabs.executeScript(tabId, {
code: 'document.body.style.backgroundColor="red"',
allFrames: true,
frameId: frameId
});
Error: Invalid value for argument 2. Property 'frameId': Unexpected property.
设置frameId = 0
(始终是有效帧 - 顶部框架)仍然失败。我必须删除frameId
或executeScript
的{{1}}属性才能成功。这个记录的功能是否未实际实现?
答案 0 :(得分:1)
根据错误报告,似乎这是一个错误,应该在Chrome 50中修复: https://bugs.chromium.org/p/chromium/issues/detail?id=63979
答案 1 :(得分:1)
经过进一步研究后,正如Rob W所说,文档错误... frameId
对executeScript
的支持和insertCSS
支持Chrome 39正如文件所述。从当前版本的Chrome 49(49.0.2623.110)开始,它不受支持。
我已成功让他们参与当前金丝雀版Chrome(51.0.2699.0)的工作。
更新: Chrome 50.0.2661.75支持frameId
和executeScript
中的insertCSS
。
答案 2 :(得分:0)
根据此github page,您需要将chrome.tabs.executeScriptInFrame
方法添加到chrome.tabs API
。此方法允许通过frameId参数在帧的上下文中运行内容脚本,而不是选项卡中的所有帧。
该方法遵循与chrome.tabs.executeScript,
相同的语法,除了使用frameId属性扩展第一个参数(由InjectDetails类型指定)。由于frameId
没有tabId
没有意义,因此tabId
参数是必需的。
注意:如果,您无法在框架中执行
chrome.tabs.executeScript
您没有顶部框架的主机权限。