tabs.executeScript()

将 JavaScript 代码注入页面。

注意: 在使用 Manifest V3 或更高版本时,请使用 scripting.executeScript() 来执行脚本。

您可以将代码注入到其 URL 可以使用 匹配模式 表达的页面中。要做到这一点,其协议必须是以下之一:httphttpsfile

您必须拥有该页面 URL 的权限 — 要么是明确的 主机权限 — 要么通过 activeTab 权限。请注意,一些特殊页面不允许此权限,包括阅读模式、查看源代码和 PDF 查看器页面。

您还可以将代码注入到随您的扩展打包的页面中

js
browser.tabs.create({ url: "/my-page.html" }).then(() => {
  browser.tabs.executeScript({
    code: `console.log('location:', window.location.href);`,
  });
});

您不需要任何特殊权限即可执行此操作。

不能将代码注入到任何浏览器的内置页面,例如:about:debuggingabout:addons 或打开新空标签页时打开的页面。

您注入的脚本称为 内容脚本

这是一个异步函数,返回一个 Promise

语法

js
let executing = browser.tabs.executeScript(
  tabId,                 // optional integer
  details                // object
)

参数

tabId 可选

integer。在其中运行脚本的标签 ID。

默认为当前窗口的活动标签页。

details

一个描述要运行的脚本的对象。

它包含以下属性

allFrames 可选

boolean。如果为 true,则代码将被注入到当前页面的所有框架中。

如果为 true 并且设置了 frameId,则会引发错误。(frameIdallFrames 是互斥的。)

如果为 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:blankabout:srcdoc 框架中,前提是您的扩展可以访问它们的父文档。代码不能插入到顶层的 about: 框架中。

默认为 false

runAt 可选

extensionTypes.RunAt。代码将最早被注入到标签页中的时间。

默认为 "document_idle"

返回值

一个 Promise,它将解析为对象数组。数组的值表示脚本在每个注入的框架中的结果。

脚本的结果是最后评估的语句,这类似于在 Web Console 中执行脚本时会输出的内容(结果,而不是任何 console.log() 输出)。例如,考虑以下脚本

js
let foo = "my result";
foo;

这里的结果数组将包含字符串 "my result" 作为元素。

结果值必须是 结构克隆able(请参阅 数据克隆算法)。

注意: 最后一条语句也可能是一个 Promise,但此功能不受 webextension-polyfill 库支持。

如果发生任何错误,Promise 将以错误消息被拒绝。

示例

此示例在当前活动标签页中执行一行代码片段

js
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" 的脚本。该脚本将在当前活动标签页中执行。脚本将在子框架和主文档中执行

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 的标签页中执行

js
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