Как лучше всего вызвать функцию сценариев содержимого из фонового сценария в расширении 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

ОК. Мне приходится списывать это с одного из моих личных расширений, но суть в следующем:

В фоновом сценарии настройте меню и назначьте функцию для опоры onclick:

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

Работает ли функция tabs.GetCurrent() в фоновом сценарии в вашем коде? Я получаю Не пойманный (в обещании) Ошибка типа: tabInfo-неопределенная ошибка. Я прочитал в документации tabs.GetCurrent (): Примечание: Эта функция полезна только в контекстах, где есть вкладка браузера, например страница параметров. Если вы вызовете его из фонового сценария или всплывающего окна, он вернется 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

Я только что еще раз взглянул на добавочный номер несколько минут назад... В отладчике, в Devtools я вижу, что загрузился только фоновый скрипт! Так вот в чем проблема. Сценарий содержимого вообще не загружается. Я не понимаю, почему, хотя, поскольку я не вижу никаких проблем в manifest.json файл.
Costas

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории