Jak najlepiej wywołać funkcję skryptów zawartości z tła skryptu w rozszerzeniu Firefox?

0

Pytanie

Chcę wywołać funkcję, zrealizowany w scenariuszu zawartości rozszerzenia, który pobiera zaznaczony tekst ze stron internetowych, z funkcji w tle scenariusze, która później zostanie wywołana w detektorze, podłączonym do pozycji menu.

Czy jest to możliwe i jaki byłby to najszybszy sposób, aby to zrobić?

Oto odpowiednie fragmenty kodu:

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

Jest oczywiste, że powyższy kod nie działa, tak jak "dedykowana" funkcja jest teraz widoczny z tła skryptu.

Więc jaki jest najszybszy / krótki sposób, aby kod działał?

1

Najlepsza odpowiedź

1

OK. Muszę odpisywać to z jednego z moich rozszerzeń, ale chodzi w następujący sposób:

W tle scenariusze dostosuj menu i określ funkcję podpory onclick:

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

Jeszcze w tym samym skrypcie uzyskać bieżące informacje o karcie i wyślij wiadomość do skryptu zawartości.

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

Scenariusz zawartości nasłuchuje komunikat:

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

I jak tylko obróbka jest zakończona, wyślij nową wiadomość z powrotem w tle scenariusz.

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

I w osobnym tle scenariusze mam coś takiego jak poniżej:

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

Czy działa funkcja tabs.GetCurrent() w tle skrypty w kodzie? Mam Nie złowione (w obietnicy) Błąd typu: tabInfo-nieokreślony błąd. Przeczytałem w dokumentacji karty.GetCurrent (): Uwaga: Ta funkcja jest przydatna tylko w kontekstach, gdzie znajduje się zakładka przeglądarki, takie jak strona ustawień. Jeśli wywołasz go z tła skryptu lub wyskakującego okna, wróci undefined.
Costas

Mój numer wewnętrzny nie działał, gdyby to nie było tak. Mój kod to tylko przykład tego, jak powinien działać, i to działa z moim tła scenariuszem. Jakie dane można uzyskać od tabs.getCurrent()?
Andy

@Costas dodałem trochę swojego kodu, którego nie brakowało (w getCurrentTab funkcja). Mam nadzieję, że to pomoże.
Andy

Otrzymałem undefined oczywiście, bo tabs.getCurrent() wracał undefined. Kod poprawiłem błąd. Teraz mam Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist z tej linii kodu: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Mam ten kod: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); w scenariuszu zawartości, ale, oczywiście, to nie wynika z tła skryptu.
Costas

Prosiłeś o przykład, ja ci go przyprowadził. W nim zawiera podstawowe informacje dotyczące wiadomości, o które prosiłeś. Ten kod może nie spełniać twoich potrzeb - trzeba tylko trochę popracować nad nim, aby go dopasować do swojego kodu. Nie tylko wyjmuj kod z tej odpowiedzi i nie oczekuj, że on zadziała. Pomyśl o tym, co można dostosować kod, zgodnie z własnymi wymaganiami.
Andy

Właśnie jeszcze raz spojrzał na numer wewnętrzny kilka minut temu... W debugerze, w Devtools widzę, że obciążyli tylko tło skrypt! Tak oto w czym problem. Scenariusz treści w ogóle nie ładuje. Nie rozumiem, dlaczego, chociaż, ponieważ nie widzę żadnych problemów w manifest.json plik.
Costas

W innych językach

Ta strona jest w innych językach

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