从 Firefox 扩展中的后台脚本调用内容脚本函数的最佳方式是什么?
What's the best way to call a content scripts' function from the background script in a Firefox extension?
我想调用一个在扩展的内容脚本中实现的函数,它从网页中获取选定的文本,从后台脚本中的一个函数中调用,该函数稍后将在连接到菜单项的侦听器中调用.
这可能吗?最短的方法是什么?
以下是相关的代码片段:
manifest.json
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
content.js
var text = "";
function highlightedText() {
text = content.getSelection();
}
background.js
function listenerFunction() {
highlightedText();
/* Doing various stuff that have to use the text variable */
}
browser.menus.onClicked.addListener((info, tab) => {
highlightedText();
});
显然,上面的代码不起作用,因为“突出显示”功能现在可以从后台脚本中看到。
那么,使代码工作的最快/最短方法是什么?
好的。我不得不从我自己的一个私人扩展中抄袭这个,但要点是:
在后台脚本中设置菜单,并为onclick属性分配一个函数:
browser.menus.create({
id: 'images',
title: 'imageDownload',
contexts: ['all'],
onclick: downloadImages
}, onCreated);
还是在同一个脚本中获取当前标签信息,并向内容脚本发送消息。
function getCurrentTab() {
return browser.tabs.query({ currentWindow: true, active: true });
}
async function downloadImages() {
const tabInfo = await getCurrentTab();
const [{ id: tabId }] = tabInfo;
browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' });
}
内容脚本侦听消息:
browser.runtime.onMessage.addListener(({ trigger }) => {
if (trigger === 'downloadImages') doSomething();
});
处理完成后,将新消息传递回后台脚本。
function doSomething() {
const data = [1, 2, 3];
browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}
在单独的后台脚本中,我有如下内容:
browser.runtime.onMessage.addListener(function (data) {
const { trigger } = data;
if (trigger === 'downloadImages') ...
});
我想调用一个在扩展的内容脚本中实现的函数,它从网页中获取选定的文本,从后台脚本中的一个函数中调用,该函数稍后将在连接到菜单项的侦听器中调用.
这可能吗?最短的方法是什么?
以下是相关的代码片段:
manifest.json
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
content.js
var text = "";
function highlightedText() {
text = content.getSelection();
}
background.js
function listenerFunction() {
highlightedText();
/* Doing various stuff that have to use the text variable */
}
browser.menus.onClicked.addListener((info, tab) => {
highlightedText();
});
显然,上面的代码不起作用,因为“突出显示”功能现在可以从后台脚本中看到。
那么,使代码工作的最快/最短方法是什么?
好的。我不得不从我自己的一个私人扩展中抄袭这个,但要点是:
在后台脚本中设置菜单,并为onclick属性分配一个函数:
browser.menus.create({
id: 'images',
title: 'imageDownload',
contexts: ['all'],
onclick: downloadImages
}, onCreated);
还是在同一个脚本中获取当前标签信息,并向内容脚本发送消息。
function getCurrentTab() {
return browser.tabs.query({ currentWindow: true, active: true });
}
async function downloadImages() {
const tabInfo = await getCurrentTab();
const [{ id: tabId }] = tabInfo;
browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' });
}
内容脚本侦听消息:
browser.runtime.onMessage.addListener(({ trigger }) => {
if (trigger === 'downloadImages') doSomething();
});
处理完成后,将新消息传递回后台脚本。
function doSomething() {
const data = [1, 2, 3];
browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}
在单独的后台脚本中,我有如下内容:
browser.runtime.onMessage.addListener(function (data) {
const { trigger } = data;
if (trigger === 'downloadImages') ...
});