Chrome 扩展 - 通过后台脚本获取 Active Tab 的 DOM 信息
Chrome Extension - Obtaining Active Tab's DOM information through background script
我知道有很多与此主题相关的问题,但 none 到目前为止,我已经在 V3 中解决了这个问题。当我运行以下background.js时,我只会得到undefined.
我的扩展的目标,至少在这个阶段,是抓取活动选项卡的 DOM 并提取所有 div 元素的文本内容。
我的 background.js 页面:
function getDOM() {
let htmlarr = [];
const pageDOM = document.getElementsByTagName('div');
for (i = 0; i < pageDOM.length; i++) {
htmlarr += pageDOM.innerHTML;
}
return Object.assign({}, htmlarr)
}
chrome.tabs.onActivated.addListener(activeInfo => {
let domRes = chrome.scripting.executeScript({
target: { tabId: activeInfo.tabId },
func: getDOM
})
console.log(domRes);
});
我的manifest.json:
{
"name": "HTML Sourcer",
"description": "Extract HTML source code",
"version": "1.0",
"minimum_chrome_version": "10.0",
"manifest_version": 3,
"permissions": ["scripting", "tabs", "activeTab"],
"host_permissions": [
"*://*/*"
],
"background": {
"service_worker": "background.js"
}
}
如有任何帮助,我们将不胜感激。谢谢!
问题 1
根据 documentation this API method returns a Promise 当没有回调参数时。
要获取 Promise 的值,添加 await 并将函数标记为 async
:
chrome.tabs.onActivated.addListener(async info => {
let domRes = await chrome.scripting.executeScript({
target: {tabId: info.tabId},
func: getDOM,
}).catch(console.error);
if (!domRes) return;
console.log(domRes);
});
有一个 catch
因为有些选项卡不支持注入,例如开始选项卡或 chrome://
个选项卡。
问题 2
In JavaScript +=
不适用于数组,但仅适用于 numbers/strings。请改用 htmlarr.push()。也不需要通过 Object.assign.
将数组转换为对象
实际上,让我们使用 Array.from:
重写 getDOM
function getDOM() {
return Array.from(
document.getElementsByTagName('div'),
el => el.innerHTML
);
}
我知道有很多与此主题相关的问题,但 none 到目前为止,我已经在 V3 中解决了这个问题。当我运行以下background.js时,我只会得到undefined.
我的扩展的目标,至少在这个阶段,是抓取活动选项卡的 DOM 并提取所有 div 元素的文本内容。
我的 background.js 页面:
function getDOM() {
let htmlarr = [];
const pageDOM = document.getElementsByTagName('div');
for (i = 0; i < pageDOM.length; i++) {
htmlarr += pageDOM.innerHTML;
}
return Object.assign({}, htmlarr)
}
chrome.tabs.onActivated.addListener(activeInfo => {
let domRes = chrome.scripting.executeScript({
target: { tabId: activeInfo.tabId },
func: getDOM
})
console.log(domRes);
});
我的manifest.json:
{
"name": "HTML Sourcer",
"description": "Extract HTML source code",
"version": "1.0",
"minimum_chrome_version": "10.0",
"manifest_version": 3,
"permissions": ["scripting", "tabs", "activeTab"],
"host_permissions": [
"*://*/*"
],
"background": {
"service_worker": "background.js"
}
}
如有任何帮助,我们将不胜感激。谢谢!
问题 1
根据 documentation this API method returns a Promise 当没有回调参数时。
要获取 Promise 的值,添加 await 并将函数标记为 async
:
chrome.tabs.onActivated.addListener(async info => {
let domRes = await chrome.scripting.executeScript({
target: {tabId: info.tabId},
func: getDOM,
}).catch(console.error);
if (!domRes) return;
console.log(domRes);
});
有一个 catch
因为有些选项卡不支持注入,例如开始选项卡或 chrome://
个选项卡。
问题 2
In JavaScript +=
不适用于数组,但仅适用于 numbers/strings。请改用 htmlarr.push()。也不需要通过 Object.assign.
实际上,让我们使用 Array.from:
重写 getDOMfunction getDOM() {
return Array.from(
document.getElementsByTagName('div'),
el => el.innerHTML
);
}