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

语法

js
let results = await browser.scripting.executeScript(
  details             // object
)

参数

details

描述要注入的脚本的对象。它包含以下属性

args 可选

要传送到函数中的参数数组。只有在指定了 func 参数时,此参数才有效。参数必须是 JSON 可序列化的。

files 可选

stringarray。要注入的 JS 文件路径的数组,相对于扩展的根目录。必须指定 filesfunc 之中的一个。

func 可选

function。要注入的 JavaScript 函数。此函数将被序列化,然后进行反序列化以进行注入。这意味着任何绑定的参数和执行上下文都会丢失。必须指定 filesfunc 之中的一个。

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() 输出)。例如,考虑以下脚本

js
let foo = "my result";
foo;

此处,结果数组包含字符串 "my result" 作为元素。

脚本结果必须是 Firefox 中的可结构化克隆值,或 Chrome 中的 JSON 可序列化值。有关此差异的更多详细信息,请参见 Chrome 不兼容性 文章中的 数据克隆算法 部分。

示例

此示例在活动选项卡中执行一行代码片段

js
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" 的文件(与扩展一起打包)的脚本。该脚本在活动选项卡中执行。该脚本在子框架和主文档中执行

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。