scripting.executeScript()
将脚本注入目标上下文。脚本默认在 document_idle
处运行。
注意: 此方法在 Chrome 和 Firefox 101 或更高版本中的清单 V3 中可用。在 Safari 和 Firefox 102+ 中,此方法在清单 V2 中也可用。
要使用此 API,您必须具有 "scripting"
权限 和目标 URL 的权限,无论是作为明确的 主机权限,还是使用 activeTab 权限。请注意,某些特殊页面不允许此权限,包括阅读器视图、view-source 和 PDF 浏览器页面。
在 Firefox 和 Safari 中,部分缺少主机权限会导致执行成功(部分结果在已解析的 Promise 中)。在 Chrome 中,任何缺少的权限都会阻止任何执行发生(参见 问题 1325114)。
您注入的脚本称为 内容脚本。
这是一个异步函数,它返回一个 Promise
。
语法
let results = await browser.scripting.executeScript(
details // object
)
参数
details
-
描述要注入的脚本的对象。它包含以下属性
args
可选-
要传送到函数中的参数数组。只有在指定了
func
参数时,此参数才有效。参数必须是 JSON 可序列化的。 files
可选-
string
的array
。要注入的 JS 文件路径的数组,相对于扩展的根目录。必须指定files
和func
之中的一个。 func
可选-
function
。要注入的 JavaScript 函数。此函数将被序列化,然后进行反序列化以进行注入。这意味着任何绑定的参数和执行上下文都会丢失。必须指定files
和func
之中的一个。 injectImmediately
可选-
boolean
。是否尽快将注入触发到目标,但并不一定在页面加载之前。 target
-
scripting.InjectionTarget
。指定要将脚本注入的目标的详细信息。 world
可选-
scripting.ExecutionWorld
。脚本执行的环境。
返回值
一个 Promise
,它使用 InjectionResult
对象的数组来实现,这些对象表示每个注入框架中注入脚本的结果。
如果注入失败,例如当注入目标无效时,Promise 会被拒绝。当脚本执行开始时,其结果会包含在结果中,无论是成功(作为 result
)还是不成功(作为 error
)。
每个 InjectionResult
对象都具有以下属性
frameId
-
number
。与注入相关的帧 ID。 result
可选-
any
。脚本执行的结果。 error
可选-
any
。如果发生错误,则包含脚本抛出或拒绝的值。通常,这是一个具有消息属性的错误对象,但它可以是任何值(包括原始值和 undefined)。Chrome 尚未支持
error
属性(参见 问题 1271527:将脚本执行中的错误传播到 InjectionResult)。作为替代方案,可以通过将要执行的代码包装在 try-catch 语句中来捕获运行时错误。未捕获的错误也会报告到目标选项卡的控制台。
脚本的结果是最后一个计算的语句,这类似于您在 Web 控制台 中执行脚本时看到的结果(而不是任何 console.log()
输出)。例如,考虑以下脚本
let foo = "my result";
foo;
此处,结果数组包含字符串 "my result
" 作为元素。
脚本结果必须是 Firefox 中的可结构化克隆值,或 Chrome 中的 JSON 可序列化值。有关此差异的更多详细信息,请参见 Chrome 不兼容性 文章中的 数据克隆算法 部分。
示例
此示例在活动选项卡中执行一行代码片段
browser.action.onClicked.addListener(async (tab) => {
try {
await browser.scripting.executeScript({
target: {
tabId: tab.id,
},
func: () => {
document.body.style.border = "5px solid green";
},
});
} catch (err) {
console.error(`failed to execute script: ${err}`);
}
});
此示例执行来自名为 "content-script.js"
的文件(与扩展一起打包)的脚本。该脚本在活动选项卡中执行。该脚本在子框架和主文档中执行
browser.action.onClicked.addListener(async (tab) => {
try {
await browser.scripting.executeScript({
target: {
tabId: tab.id,
allFrames: true,
},
files: ["content-script.js"],
});
} catch (err) {
console.error(`failed to execute script: ${err}`);
}
});
浏览器兼容性
BCD 表仅在浏览器中加载
注意: 此 API 基于 Chromium 的 chrome.scripting
API。