Aký je najlepší spôsob, ako volať obsah skriptov' funkciu z pozadia skript v prehliadači Firefox extension?

0

Otázka

Chcem zavolať funkciu, ktorá je implementovaná do obsahu scenár predĺženie, ktorá sa dostane vybraný text z webových stránok, z funkcie v pozadí skript, ktorý bude neskôr volal, že poslucháč pripojený na položku ponuky.

Je to možné a aký by mal byť čo najkratšom spôsob, ako to urobiť?

Tu sú relevantné útržky kódu:

zoznam lodného nákladu.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();
  });

Samozrejme, čím vyššie kód nefunguje ako "upozornili" funkcia je teraz viditeľná z pozadia skriptu.

Takže, čo je najrýchlejší / najkratšiu cestu, aby zákonníka práce?

1

Najlepšiu odpoveď

1

OK. Mám na postieľky to od jedného z mojich vlastné rozšírenia, ale podstata je:

V pozadí skript nastaviť menu, a priradiť funkciu onclick prop:

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

Ešte v tom istom skript získať aktuálnu kartu informácie, a odoslanie správy na obsah skriptu.

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 skriptu počúva správy:

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

A raz spracovanie sa vykonáva prejsť novú správu späť na pozadí skriptu.

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

A v samostatnom pozadí skript mám niečo ako nasledujúce:

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

Robí karty.getCurrent() pracovať v pozadí skript v kóde? Som si Uncaught (v promise) TypeError: tabInfo je definované chyba. Čítal som v kartách.getCurrent() dokumentácia: Poznámka: Táto funkcia je užitočná iba v kontexte, kde je prehliadač kartu, ako je napríklad možnosti stránky. Ak ste hovor z pozadia skript alebo popup, sa vráti undefined.
Costas

Moje rozšírenie nebude fungovať, ak to neurobili. Môj kód je len príklad, ako by to malo fungovať, a že pracuje s mojím pozadí skriptu. Aké údaje sú na vás, ako sa dostať z tabs.getCurrent()?
Andy

@Costas som pridal trochu mojej kód, ktorý chýba (na getCurrentTab funkcia). Dúfajme, že to pomôže.
Andy

Bol som stále undefined samozrejme, pretože tabs.getCurrent() bol vracia undefined. Váš kód opravili chyby. Teraz som získanie Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist z tohto riadku kód: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Mám tento kód: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); v obsahu skript, ale zrejme to nie je vidieť v pozadí skriptu.
Costas

Budete požiadaní, pre príklad, dal som si jedno. Zobrazuje základné informácie o aplikácii správy čo je to, čo ste žiadali. Tento kód nemusí sa zmestili vaše špeciálne požiadavky - stačí obísť to trochu, aby sa zmestili svoj kód. Nechcem len zdvihnúť kód z tohto odpoveď a očakávať, že sa do práce. Myslieť si môžete prispôsobiť kód, aby sa zmestili vaše požiadavky.
Andy

Len som sa mal pozrieť na rozšírenie znova o niekoľko minút pred... V debugger, v Devtools vidím, že len pozadí skript má načítaná! Tak to je problém. Obsah skriptu nenačíta vôbec. Ja to nechápem, prečo keď, ako som sa nezobrazujú žiadne problémy v manifest.json súbor.
Costas

V iných jazykoch

Táto stránka je v iných jazykoch

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