在 popup.js 中,我使用以下代码来显示当前选项卡的某个 div id 内的所有文本 - 并在警报中显示。我想知道如何将 div 文本保存到 popup.js 中的变量中?
没有返回任何内容:
var getText = chrome.tabs.executeScript({
code: "document.getElementById('DIVid').innerText"
});
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
的异步性质,您在回调内有更新变量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;
}
这是实现这一目标的现代而简洁的方法:
定义可重用的类似 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
如果您使用 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);
});