2016-10-07 7 views
0

Как управлять переменной в фоновом скрипте из сценария (всплывающего)?
Чтобы получить ресурс каждые 10 секунд, я использую цикл setTimeout в приведенном ниже коде.
Но ниже коды не останавливают цикл, когда я снял флажок на всплывающей странице (browser_action).Как взаимодействовать между фоновым скриптом и скриптом страницы (всплывающего)?

Я ожидал, что когда я (установите или снимите) флажок во всплывающем окне, то page_script отправить сообщение фонового скрипта, если фон получить stop_loop сообщений, изменение фона сценария settimeout_loop_controller ложь, чтобы остановить SetTimeout петли.

Но эти коды не реагируют, когда я устанавливаю флажок.

Как общаться между двумя сценариями?

let settimeout_loop_controller = true; 

function fetching() { 
    if (settimeout_loop_controller) { 
    // if 'settimeout_loop_controller become false, the loop will stop. 
     fetch("http://url.com/example").then((getval) => { do_something })... ; 
     setTimeout(fetching, 10000); 
    } else { 
     return; 
    } 
} 

fetching(); 

chrome.runtime.onMessage.addListener((message) => { 
    if message.type === "stop_loop" { 
     settimeout_loop_controller = false; 
    } 
    else if (message.type === "start_loop") { 
     settimeout_loop_controller = true; 
     fetching(); 
    } 
}); 

всплывающее окно сценария:

let checkbox = document.getElementById("checkbox"); 

checkbox.onchange((e) => { 
    if (checkbox.checked) { 
     chrome.runtime.sendMessage({"type": "start_loop"}); 
    } 
    else { 
     chrome.runtime.sendMessage({"type": "stop_loop"}); 
    } 
}); 
+0

Пожалуйста, отредактируйте эту тему: включите ** полный ** [mcve], дублирующий проблему. Обычно включают * manifest.json *, некоторые из фоновых, контентных и всплывающих скриптов и HTML. Вопросы, требующие помощи по отладке («** почему этот код не работает? **)) должны включать: ► желаемое поведение, ► конкретную проблему или ошибку * и * самый короткий код, необходимый для его воспроизведения ** в вопросе сам**. Вопросы без четкого описания проблемы не полезны другим читателям. Смотрите: «** Как создать [mcve] **», [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/on-topic) и [ask]. – Makyen

+0

Мой ответ на страницу настроек Firefox WebExtension (http://stackoverflow.com/a/39236352/3773011) предоставляет полностью функциональный, протестированный в Firefox и Chrome, пример четырех (несколько) способов взаимодействия между опциями/всплывающее окно и фоновый скрипт. – Makyen

+0

Причина, по которой требуется [mcve], заключается в том, что мы хотим помочь. Это намного проще, если нам не нужно воссоздать весь код, необходимый для дублирования проблемы. Это код, который у вас уже есть. Поэтому, пожалуйста, помогите нам помочь вам и предоставить * полный * [mcve], который дублирует проблему с такими вопросами. Без [mcve] количество усилий, требуемых даже для того, чтобы помочь вам, - это ** намного больше, что * значительно * уменьшает количество желающих или способных помочь вам. Даже если мы приложим дополнительные усилия, мы должны * угадать * в значительных частях вашей проблемы. – Makyen

ответ

2

chrome.runtime.sendMessage API не существует в страницы сценария, но она может быть доступна в содержимого сценария. Типичное использование page script сообщение сценарий содержания с использованием window.postMessage({"type": "stop_loop"},"*"), а затем пересылка сообщения внутри сценарий содержания.
Для Firefox 49 и более новой версии вы можете Sharing objects with page scripts. Например, вы можете определить функцию notify() и exportFunction(notify, window, {defineAs:'notify'}); в сценарий содержания. Скрипт страницы сможет вызвать открытую функцию в объекте window.

window.notify («Сообщение со скрипта страницы!»);

 Смежные вопросы

  • Нет связанных вопросов^_^