You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展Manifest V2转V3时如何获取executeScript的返回值

Manifest V3 chrome.scripting.executeScript 读取返回值异常解决方案

问题原因

Manifest V3 中 chrome.scripting.executeScript 的返回结构、权限要求都和 V2 的 chrome.tabs.executeScript 有差异,你遇到的 undefined 问题主要由两个原因导致:

  1. 返回结果结构变更:V3 注入脚本的返回值不会直接放在回调参数的数组元素中,而是封装在对应元素的 result 属性里
  2. 权限配置缺失:使用 scripting API 需要提前在 manifest.json 中声明对应权限

第一步:修正 manifest.json 配置

在 manifest.json 中添加以下权限配置:

{
  "manifest_version": 3,
  // 其他原有配置...
  "permissions": ["scripting", "activeTab"],
  // 如果需要注入所有页面,添加host_permissions
  "host_permissions": ["<all_urls>"]
}
  • 如果你的脚本是点击扩展图标触发的,仅声明 activeTab 权限即可满足当前活跃标签页的注入需求,无需额外配置 host_permissions
  • 如果需要后台自动注入非活跃标签页,需要补充对应域名的 host_permissions

第二步:修正代码逻辑

调整回调中返回值的读取路径,修正后的代码如下:

chrome.tabs.query({
  active: true,
  currentWindow: true
}, function (tabs) {
  chrome.scripting.executeScript({
    function: () => window.getSelection().toString(),
    target: {tabId: tabs[0].id}
  }, function (selection) {
    // 从result字段读取注入脚本的返回值
    console.log(selection[0].result);
    // 后续业务逻辑
  });
});

可选优化:使用 async/await 写法

如果你的扩展运行在 Chrome 89+ 版本(支持 promise 风格调用),可以改用更简洁的 async/await 写法避免回调嵌套:

async function getSelectedText() {
  const [tab] = await chrome.tabs.query({active: true, currentWindow: true});
  const [result] = await chrome.scripting.executeScript({
    target: {tabId: tab.id},
    function: () => window.getSelection().toString()
  });
  console.log(result.result);
  return result.result;
}

内容的提问来源于stack exchange,提问作者xxlali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 22:24:01