从 chrome.scripting.executeScript 或 chrome.tabs.executeScript 返回值

问题描述 投票:0回答:3

在 popup.js 中,我使用以下代码来显示当前选项卡的某个 div id 内的所有文本 - 并在警报中显示。我想知道如何将 div 文本保存到 popup.js 中的变量中?

没有返回任何内容:

var getText = chrome.tabs.executeScript({
  code: "document.getElementById('DIVid').innerText"
});
google-chrome-extension
3个回答
17
投票

清单V2:

var getText = Array();
chrome.tabs.executeScript(tabs[tab].id, {
    "code": "document.getElementById(\"_Your_ID_Here_\").innerText.split(' ')"
}, function (result) {
    for (i = 0; i < result[0].length; i++)
    getText [i] = result[0][i];
    console.log(getText);
});

由于 chrome.api

的异步性质,您在回调内有更新变量

清单V3:

async function example(tabId) {
  if (tabId == null)
    [{id: tabId}] = await chrome.tabs.query({active: true, currentWindow: true});
  const [{result}] = await chrome.scripting.executeScript({
    target: {tabId},
    args: ['foo', 'bar'],
    func: (arg1, arg2) => [
      document.querySelector(arg1)?.textContent,
      document.querySelector(arg2)?.textContent,
    ],
  });
  console.log(result);
  return result;
}

2
投票

这是实现这一目标的现代而简洁的方法:

定义可重用的类似 Promise 的包装函数

const executeScript = (tabId, func) => new Promise(resolve => {
  chrome.scripting.executeScript({ target: { tabId }, func }, resolve)
}

用途:

const [{result: selection}] = await executeScript(tabId,
  () => document.getSelection().toString()
)
console.log(selection) // log page selection

1
投票

如果您使用 chrome.scripting.executeScript,我注意到

func
无法直接返回对象。我必须使用
JSON.parse
序列化响应,否则脚本将永远不会返回该值。

破损:

chrome.scripting.executeScript({
    target: { tabId: request.tabId },
    world: 'MAIN',
    func: () => {
      const sessionService = window.namespace.__container__.lookup('service:session');
      const user = sessionService.get('user');
      const course = sessionService.get('course');
      const activity = sessionService.get('activity');
      return { user, course, activity };
    }
  }, (bundleInfo) => {
    console.log(bundleInfo) // This never gets logged
  });

工作:

chrome.scripting.executeScript({
    target: { tabId: request.tabId },
    world: 'MAIN',
    func: () => {
      const sessionService = window.namespace.__container__.lookup('service:session');
      const user = sessionService.get('user');
      const course = sessionService.get('course');
      const activity = sessionService.get('activity');
      return JSON.stringify({ user, course, activity }); // Serialize the object before returning
    }
  }, (bundleInfo) => {
    console.log(bundleInfo);
  });
© www.soinside.com 2019 - 2024. All rights reserved.