Ce e cel mai bine pentru a apela un script-uri de conținut funcția de fundal script-ul într-o extensie Firefox?

0

Problema

Vreau pentru a apela o funcție, care este implementat în conținutul script de o extensie, care devine textul selectat din paginile web, dintr-o funcție în fundal script care va fi numit mai târziu, într-un ascultător conectat la un element de meniu.

Este posibil și ceea ce va fi cea mai scurtă cale de a face asta?

Aici sunt cele mai relevante fragmente de cod:

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

Evident, codul de mai sus nu este de lucru ca "evidențiat" funcția este acum vizibil din fundal script.

Deci, ce e cel mai rapid / mai scurt drum pentru a face codul munca?

1

Cel mai bun răspuns

1

OK. Am nevoie să pătuț asta de la unul de-al meu privat extensii dar esenta este aceasta:

În fundal script set up meniu, și să alocați o funcție a onclick prop:

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

Încă în același script obține curent fila informații, și trimite un mesaj la conținutul script.

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

Conținutul script ascultă pentru mesaj:

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

Și o dată ce prelucrarea este făcut să treacă un nou mesaj fundal script.

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

Și într-un fundal separat script eu am ceva de genul următor:

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

Are file.getCurrent() lucrează în fundal script în codul dvs.? Am primit un Neprins (în promit) TypeError: tabInfo este nedefinit de eroare. Am citit în file.getCurrent() documentație: Notă: Această funcție este utilă numai în contexte în care există o filă de browser, cum ar fi o pagină de opțiuni. Dacă ai apela la un fond de script sau un pop-up, acesta va reveni undefined.
Costas

Extensia mea nu ar funcționa dacă nu. Codul meu este doar un exemplu de cum ar trebui să funcționeze, și care funcționează cu trecutul meu script. Ce date sunt obtinerea de tabs.getCurrent()?
Andy

@Costas am adaugat un pic de codul meu, care a fost lipsă (la getCurrentTab funcția). Sperăm că va ajuta.
Andy

Am fost obtinerea undefined evident, pentru că tabs.getCurrent() se întorcea undefined. Codul reparat eroarea. Acum am o Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist din această linie de cod: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Am acest cod: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); în conținutul script, dar, evident, nu e văzut de fundal script.
Costas

Ai cerut un exemplu, am dat unul. Se prezinta elementele de bază despre mesagerie, care este ceea ce ai cerut. Acest cod nu s-ar putea potrivi cerințelor dumneavoastră în mod special - trebuie doar pentru a lucra în jurul valorii de un pic pentru a se potrivi cod. Nu ridicați doar codul de acest răspuns și se așteaptă ca aceasta să funcționeze. Gândiți-vă puteți adapta codul pentru a se potrivi cerințelor dumneavoastră.
Andy

Am avut o privire la extinderea din nou în urmă cu câteva minute... In debugger, în Devtools văd că numai fundal script-ul s-a incarcat! Deci asta e problema. Conținutul script-ul nu se incarca deloc. Nu înțeleg de ce, deși, ca eu nu văd nici o problemă în manifest.json fișierul.
Costas

În alte limbi

Această pagină este în alte limbi

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