Co je nejlepší způsob, jak zavolat obsah scripts' funkce z pozadí skript do Firefoxu rozšíření?

0

Otázka

Chci zavolat funkci, která je implementována v obsahu skript rozšíření, které získá vybraný text z webové stránky, z funkce na pozadí skript, který bude později zavolal posluchač připojená k položce nabídky.

Je to možné a jaký by byl nejkratší způsob, jak to udělat?

Zde jsou příslušné fragmenty kódu:

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

Je zřejmé, že výše uvedený kód nefunguje jako "zvýrazněný" funkce je nyní viditelný z pozadí skript.

Takže, co je nejrychlejší / nejkratší kód, aby se práce?

1

Nejlepší odpověď

1

OK. Mám na postýlce to jeden z mé vlastní rozšíření, ale podstata je tato:

V pozadí skript, nastavit menu, a přiřadit funkci onclick prop:

browser.menus.create({
  id: 'images',
  title: 'imageDownload',
  contexts: ['all'],
  onclick: downloadImages
}, onCreated);

Stále stejný scénář získat aktuální údaje na kartě, a poslat zprávu do obsahu skript.

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' });
}

Obsah skript poslouchá zprávu:

browser.runtime.onMessage.addListener(({ trigger }) => {
  if (trigger === 'downloadImages') doSomething();
});

A po zpracování se provádí projít novou zprávu na pozadí skript.

function doSomething() {
  const data = [1, 2, 3];
  browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}

A v samostatném pozadí skript mám něco jako následující:

browser.runtime.onMessage.addListener(function (data) {
  const { trigger } = data;
  if (trigger === 'downloadImages') ...
});
2021-10-29 12:40:02

Dělá karet.getCurrent() práce v pozadí script v kódu? Já si Nezachycená (slib) TypeError: tabInfo je nedefinovaná chyba. Četl jsem v kartách.getCurrent() dokumentace: Poznámka: Tato funkce je užitečná pouze v kontextech, kde je v záložce prohlížeče, např. možnosti stránka. Pokud budete volat z pozadí skript nebo popup, že se vrátí undefined.
Costas

Moje rozšíření nefungovalo, kdyby to neudělal. Můj kód je pouze příklad, jak by to mělo fungovat, a to pracuje s mou pozadí skript. Jaké údaje jste získali od tabs.getCurrent()?
Andy

@Costas jsem přidal trochu můj kód, který chybí ( getCurrentTab funkce). Doufejme, že to pomůže.
Andy

Byl jsem stále undefined samozřejmě, protože tabs.getCurrent() vracel undefined. Kód opravena chyba. Teď jsem dostat Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist z tohoto řádku kódu: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Mám tento kód: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); v obsahu skript, ale samozřejmě to není vidět z pozadí skript.
Costas

Ptal jste se na příklad, co jsem ti dal. To zobrazuje základní informace o zasílání zpráv, které je to, co jste chtěl. Tento kód nemusí se vešly vaše požadavky konkrétně - jen musíte pracovat kolem toho trochu, aby se vešly váš kód. Ne jen výtah kód z této odpovědi a očekávat, že bude fungovat. Myslet si můžete upravit kód, aby se vešly vaše požadavky.
Andy

Jen jsem se podíval na prodloužení za pár minut znovu... V ladicí program, v Devtools vidím, že jen na pozadí skript byl načten! Takže, to je problém. Obsah skript nenačte vůbec. Nechápu, proč i když, jak nevidím žádné problémy v manifest.json soubor.
Costas

V jiných jazycích

Tato stránka je v jiných jazycích

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