Добавление таймера к слушателю событий в JavaScript - PullRequest
4 голосов
/ 10 августа 2011

У меня небольшие проблемы с управлением загрузкой сайтов в расширении Firefox.

Я использую JavaScript и разрабатываю расширение Firefox для поиска строки в списке моих собственных веб-сайтов., чтобы искать плохие слова.Проблема в том, что я ищу в списке один за другим.Это означает, что я загружаю веб-страницу и добавляю прослушиватель событий в DOMContentLoaded;когда DOM загружает функцию, вызывается для поиска строки.Но, если страница не загружается (например, проблема с сетью), функция никогда не вызывается.

Есть ли способ установить таймер для прослушивателя событий?Если событие не сработало в течение 5 секунд, сделайте что-нибудь.Или, если есть другой способ сделать это, пожалуйста, совет!Я много свернул код, но думаю, вы можете понять эту идею здесь.

function main_(){
            //do some stuff here and if needed call to open a new page
            waitForDOM();
}

function waitForDOM(){
            //if the list of pages is grather than 0 then
    //add the new tab here and create the event listener
    gBrowser.addEventListener('DOMContentLoaded',pageLoaded,true);
 }

function pageLoaded(aEvent) {
        //do the search here and calls the function waitForDOM to load a new page and a event listener
    waitForDOM();
}

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Я ничего не знаю о кодировании расширений Firefox, но в общем смысле вы, безусловно, можете установить таймер на что-то, если ваш обработчик событий не вызывается в течение определенного времени.Примерно так:

var eventTriggeredFlag = false;

function waitForDOM(){
  gBrowser.addEventListener('DOMContentLoaded',pageLoaded,true);
  setTimeout(function(){
               if (!eventTriggeredFlag) {
                  // time's up without the event: do something
               }
             }, 5000);
}

function pageLoaded(aEvent) {
  eventTriggeredFlag = true;
  // whatever else you want to do here...
}

Если вам нужно отслеживать несколько событий с отдельными таймерами, вам, очевидно, придется сделать это более сложным, возможно, с некоторыми замыканиями, массивом событий или чем-то подобным.

0 голосов
/ 10 августа 2011

Лучше добавить обработчик прогресса вместо использования DOMContentLoaded.Метод onStateChange вашего обработчика прогресса всегда будет вызываться с флагами STATE_STOP и STATE_IS_WINDOW, когда страница завершит загрузку - независимо от того, есть ошибка или нет.Вы можете позвонить Components.isSuccessCode(aStatus), чтобы узнать, успешно ли загружена страница (обратите внимание, что при этом будут сообщаться только сетевые ошибки, ошибки HTTP, такие как 404, будут по-прежнему считаться успешными).

...