chrome.scripting.executeScript MV3 |如何从回调范围设置本地范围 属性 值
chrome.scripting.executeScript MV3 | How to set local scope property value from the callback scope
考虑这段代码:
// background.js
function Action(tab) {
let title;
function domTitle() {
return document.title;
}
chrome.scripting.executeScript({target: {tabId: tab.id}, func: domTitle}, injectionResults => {
for (const frameResult of injectionResults) {
this.title = frameResult.result;
console.log(this); // line 10
console.log(this.title); // line 11
}
});
}
chrome.contextMenus.onClicked.addListener(((info, tab) => {
const action = new Action(tab);
console.log(action); // line 29
console.log(action.title); // line 30
}));
控制台输出:
为什么第 30 行(操作的标题 属性 标题)未定义? 属性明明已经设置好了
如何解决?所以第 30 行将保存由 chrome.scripting.executeScript.
设置的值
新 v3 清单 api return 承诺的几乎所有 chrome.* 功能。
这是我的解决方案:
// background.js
const contextMenu = () => {
chrome.contextMenus.create({
"id": "myIdContextMenu",
"title": "My Context Menu Title",
"documentUrlPatterns": [
"http://*/*",
"https://*/*"
]
});
};
async function getValues(tab) {
function domTitle() {
return document.title;
}
const dom = chrome.scripting.executeScript({target: {tabId: tab.id}, func: domTitle})
.then(result => {return {name: "cookies", values: result}});
const cookies = chrome.cookies.getAll({domain: "google.com"})
.then(result => {return {name: "dom", values: result}});
return await Promise.all([cookies, dom]);
}
chrome.contextMenus.onClicked.addListener((info, tab) => {
getValues(tab).then(values => {
console.log(values);
// Rest of my logic here.
})
.catch(error => {
console.error(error.message)
});
});
chrome.runtime.onStartup.addListener(contextMenu);
chrome.runtime.onInstalled.addListener(contextMenu);
考虑这段代码:
// background.js
function Action(tab) {
let title;
function domTitle() {
return document.title;
}
chrome.scripting.executeScript({target: {tabId: tab.id}, func: domTitle}, injectionResults => {
for (const frameResult of injectionResults) {
this.title = frameResult.result;
console.log(this); // line 10
console.log(this.title); // line 11
}
});
}
chrome.contextMenus.onClicked.addListener(((info, tab) => {
const action = new Action(tab);
console.log(action); // line 29
console.log(action.title); // line 30
}));
控制台输出:
为什么第 30 行(操作的标题 属性 标题)未定义? 属性明明已经设置好了
如何解决?所以第 30 行将保存由 chrome.scripting.executeScript.
设置的值新 v3 清单 api return 承诺的几乎所有 chrome.* 功能。
这是我的解决方案:
// background.js
const contextMenu = () => {
chrome.contextMenus.create({
"id": "myIdContextMenu",
"title": "My Context Menu Title",
"documentUrlPatterns": [
"http://*/*",
"https://*/*"
]
});
};
async function getValues(tab) {
function domTitle() {
return document.title;
}
const dom = chrome.scripting.executeScript({target: {tabId: tab.id}, func: domTitle})
.then(result => {return {name: "cookies", values: result}});
const cookies = chrome.cookies.getAll({domain: "google.com"})
.then(result => {return {name: "dom", values: result}});
return await Promise.all([cookies, dom]);
}
chrome.contextMenus.onClicked.addListener((info, tab) => {
getValues(tab).then(values => {
console.log(values);
// Rest of my logic here.
})
.catch(error => {
console.error(error.message)
});
});
chrome.runtime.onStartup.addListener(contextMenu);
chrome.runtime.onInstalled.addListener(contextMenu);