什么是最佳的方式称呼一个内容脚本功能,从背景中的脚本Firefox扩展?

0

的问题

我想打电话给一个函数,是实现在脚本内容的扩展,获得的选定文本的网页,从功能的背景脚本,这将是后来所谓的在监听器连接到一个菜单的项目。

这是可能的和什么是最短的方式来做到这一点?

这里有相关代码段:

清单。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();
  });

显然,上面的代码不是作为"强调"功能是现在可见的背景脚本。

那么,什么是最快捷/短的方式使代码的工作?

1

最好的答案

1

"确定"。 我有婴儿床这个从我的一个私人的扩展,但其要旨是:

在该背景剧本设定的菜单,并分配功能的果托:

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') ...
});
2021-10-29 12:40:02

不会的标签。状态下()工作的背景脚本在你的代码吗? 我得到一个 未捕获的(在承诺)类型错误:tabInfo是不确定的 错误。 我读的 标签。状态下() 文件: 注: 此功能只是有用的上下文中有一浏览器标签,例如一个选项页。 如果你把它从脚本背景或弹出,它将返回 undefined.
Costas

我的扩展也不会工作如果没有。 我的代码是只有一个例子应当如何工作,并与我的背景脚本。 什么样的数据你是从 tabs.getCurrent()?
Andy

@Costas我加了一点我的代码丢失(的 getCurrentTab 功能)。 希望这将有所帮助。
Andy

我得到 undefined 很明显,因为 tabs.getCurrent()undefined. 你的代码的固定错误。 现在我得到一个 Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist 从这一行代码: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); 我有这个代号: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); 在内容脚本,但这显然是看不见的背景脚本。
Costas

你要求的一个例子,我给你一个。 它显示了有关的基础知识的消息是什么,你提出的要求。 这个代码可能不适合你的要求,具体地说-你只需要工作它周围的有点适合你的代码。 不只是提起码从这个答案,并期望它的工作。 想想你可以适应的代码,以满足您的要求。
Andy

我只是看看再次延长几分钟前...在调试器,从我看见那只脚本背景已载入! 所以这就是问题所在。 内容脚本不负荷。 我不明白为什么但我没有看到任何问题 manifest.json 文件。
Costas

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................