tabs.executeScript()
将 JavaScript 代码注入页面。
注意: 在使用 Manifest V3 或更高版本时,请使用 scripting.executeScript() 来执行脚本。
您可以将代码注入到其 URL 可以使用 匹配模式 表达的页面中。要做到这一点,其协议必须是以下之一:http、https 或 file。
您必须拥有该页面 URL 的权限 — 要么是明确的 主机权限 — 要么通过 activeTab 权限。请注意,一些特殊页面不允许此权限,包括阅读模式、查看源代码和 PDF 查看器页面。
您还可以将代码注入到随您的扩展打包的页面中
browser.tabs.create({ url: "/my-page.html" }).then(() => {
browser.tabs.executeScript({
code: `console.log('location:', window.location.href);`,
});
});
您不需要任何特殊权限即可执行此操作。
您不能将代码注入到任何浏览器的内置页面,例如:about:debugging、about:addons 或打开新空标签页时打开的页面。
您注入的脚本称为 内容脚本。
这是一个异步函数,返回一个 Promise。
语法
let executing = browser.tabs.executeScript(
tabId, // optional integer
details // object
)
参数
tabId可选-
integer。在其中运行脚本的标签 ID。默认为当前窗口的活动标签页。
details-
一个描述要运行的脚本的对象。
它包含以下属性
allFrames可选-
boolean。如果为true,则代码将被注入到当前页面的所有框架中。如果为
true并且设置了frameId,则会引发错误。(frameId和allFrames是互斥的。)如果为
false,则代码仅注入到顶层框架。默认为
false。 code可选-
string。要注入的代码,作为文本字符串。警告: 不要使用此属性将不受信任的数据插入 JavaScript,这可能会导致安全问题。
file可选-
string。包含要注入的代码的文件路径。- 在 Firefox 中,非从扩展根目录开始的相对 URL 将相对于当前页面 URL 进行解析。
- 在 Chrome 中,这些 URL 将相对于扩展的基础 URL 进行解析。
要实现跨浏览器兼容,您可以将路径指定为相对 URL,从扩展的根目录开始,如下所示:
"/path/to/script.js"。 frameId可选-
integer。代码应注入的框架。默认为
0(顶层框架)。 matchAboutBlank可选-
boolean。如果为true,则代码将被注入到嵌入的about:blank和about:srcdoc框架中,前提是您的扩展可以访问它们的父文档。代码不能插入到顶层的about:框架中。默认为
false。 runAt可选-
extensionTypes.RunAt。代码将最早被注入到标签页中的时间。默认为
"document_idle"。
返回值
一个 Promise,它将解析为对象数组。数组的值表示脚本在每个注入的框架中的结果。
脚本的结果是最后评估的语句,这类似于在 Web Console 中执行脚本时会输出的内容(结果,而不是任何 console.log() 输出)。例如,考虑以下脚本
let foo = "my result";
foo;
这里的结果数组将包含字符串 "my result" 作为元素。
注意: 最后一条语句也可能是一个 Promise,但此功能不受 webextension-polyfill 库支持。
如果发生任何错误,Promise 将以错误消息被拒绝。
示例
此示例在当前活动标签页中执行一行代码片段
function onExecuted(result) {
console.log(`We made it green`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
const makeItGreen = 'document.body.style.border = "5px solid green"';
const executing = browser.tabs.executeScript({
code: makeItGreen,
});
executing.then(onExecuted, onError);
此示例执行一个文件(随扩展打包)名为 "content-script.js" 的脚本。该脚本将在当前活动标签页中执行。脚本将在子框架和主文档中执行
function onExecuted(result) {
console.log(`We executed in all subframes`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
const executing = browser.tabs.executeScript({
file: "/content-script.js",
allFrames: true,
});
executing.then(onExecuted, onError);
此示例执行一个文件(随扩展打包)名为 "content-script.js" 的脚本。该脚本将在 ID 为 2 的标签页中执行
function onExecuted(result) {
console.log(`We executed in tab 2`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
const executing = browser.tabs.executeScript(2, {
file: "/content-script.js",
});
executing.then(onExecuted, onError);
扩展程序示例
浏览器兼容性
加载中…
注意: 此 API 基于 Chromium 的 chrome.tabs API。此文档源自 Chromium 代码中的 tabs.json。