Предотвращение открытия расширений Chrome popup.html от самооткрытия

#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 вы можете проверить, активно ли соединение в данный момент. Если это так, передайте необходимые сообщения, в противном случае подождите, пока соединение не будет активным.