#javascript #jquery #google-chrome-extension
#javascript #jquery #google-chrome-extension
Вопрос:
Я создаю расширение Chrome, в котором есть background.html
файл, который запрашивает информацию из API раз в минуту. Как только он получает информацию, он отправляет сообщение popup.html
с информацией JSON, которую popup использует для добавления новых HTML-элементов в тело всплывающего окна.
Проблема в том, что фоновый режим постоянно запущен (как и должно быть), но он будет проверять всплывающее окно, даже когда всплывающее окно закрыто. Это приводит к тому, что всплывающее окно открывается само по себе каждую минуту, что очень раздражает.
Я хочу знать, есть ли способ увидеть, закрыто ли всплывающее окно, и ничего не делать, если это так? Или есть другой способ предотвратить самостоятельное открытие всплывающего окна?
Вот репозиторий Github, но важные части выделены ниже.
Вот как я вызываю всплывающее окно:
// background.js
function sendQuestions()
{
var questions = JSON.parse(db.getItem(storage));
chrome.extension.sendRequest(appid, { 'questions': questions }, function() {});
}
setInterval(sendQuestions, 60e3);
Вот как всплывающее окно обрабатывает это:
// popup.js
chrome.extension.onRequest.addListener(function(request) {
if (request.questions) {
displayQuestions(request.questions);
}
});
function displayQuestions(questions)
{
for (i = 0; i < questions.length; i ) {
var question = questions[i];
var htmlBlock = // ... generate a block of html ...
$('#container').prepend(htmlBlock);
}
}
Комментарии:
1. Можете ли вы показать, как вы вызываете всплывающее окно? Если это приведет к открытию всплывающего окна, это было бы потрясающе, поскольку AFAIK раньше не было возможности открыть его программно 🙂
2. Я добавил переменную
isPopup = true
в popup.html и затем используетсяgetViews
из background.html , а затем проверьте для каждого представления, имеет ли оноisPopup
свойство. В этом случае всплывающее окно открывается, в противном случае нет. code.google.com/chrome/extensions /…3. @pimvbd Связь осуществляется только между
popup.html
иbackground.html
, поэтому я знаю, чей кто. Есть ли способ определить, что всплывающее окно в данный момент закрыто из фонового режима? В этом случае я мог бы использовать это логическое значение, чтобы предотвратить отправку сообщения в фоновом режиме.4. @Gisborne: Ну,
getViews
возвращает только открытые в данный момент окна, то есть всегда bg и иногда popup. Просто проверьте, содержит ли какое-либо из возвращенных оконisPopup
свойство, и вы узнаете, открыто всплывающее окно или нет.5. О, я понимаю! Я попробую это через мгновение.
Ответ №1:
Открывайте длительное соединение из всплывающего окна с background_page в любое время, когда оно открывается. На странице background_page вы можете проверить, активно ли соединение в данный момент. Если это так, передайте необходимые сообщения, в противном случае подождите, пока соединение не будет активным.