2014-08-16 2 views
6

В примере приложения Кордову обеспечивает через cordova create ..., следующий код прослушивает deviceready события:Как проверить, готова ли кордова, если событие deviceready уже запущено?

bindEvents: function() { 
    document.addEventListener('deviceready', this.onDeviceReady, false); 
}, 

Это хорошо, но то, что происходит, когда событие вызывается, прежде чем я уже успел выслушать его? В качестве примера, замените код из примера приложения (выше) со следующим:

bindEvents: function() { 
    setTimeout(function() { 
     document.addEventListener('deviceready', this.onDeviceReady, false); 
    }, 2000) 
}, 

В этом примере, this.onDeviceReady никогда не вызывается. Не было бы лучшего и надежного способа проверить, готова ли кордова? Что-то вроде этого:

bindEvents: function() { 
    setTimeout(function() { 
     if (window.cordovaIsReady) { 
      this.onDeviceReady() 
     } else { 
      document.addEventListener('deviceready', this.onDeviceReady, false); 
     } 
    }, 2000) 
}, 

ответ

12

Согласно Cordova документации

deviceready событие ведет себя несколько иначе, чем другие. Любой обработчик события , зарегистрированный после пожара события deviceready, вызывает свою вызывающую функцию .

Как вы можете увидеть, если любой обработчик события присоединен ПОСЛЕ deviceready уволила будет называться немедленно.
В setTimeout функция это больше не указывает на предполагаемый объект, контекст отличается. Поэтому ваш обработчик никогда не будет вызван.
Вы можете использовать приведенный ниже код, поместив его в свой тег <head>, где я использую глобальные функции/переменные (избегая этих контекстных проблем для простоты). Это должно показать вам предупреждение.

<script> 
    function onDeviceReady() { 
    alert("Calling onDeviceReady()"); 
    } 

    setTimeout(function() { 
      document.addEventListener('deviceready', onDeviceReady, false); 
    }, 9000); 
</script> 
+0

Вы правы. Я совершенно неверно истолковал этот вопрос. – Shawn

-1

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

deviceready Обработчик событий будет создан во время загрузки DOM. Поэтому, чтобы использовать событие, мы должны ждать до DOMContentLoaded. после этого мы можем добавить слушателя к событию deviceready

document.addEventListener("DOMContentLoaded", function() { 
    //alert("Calling DOMContentLoaded"); 
    document.addEventListener('deviceready', function(){ 
     //alert("Calling onDeviceReady()"); 
     callFirebase(); 
    }, false); 
}); 
+0

Я думаю, вы пропустили точку принятого ответа: @frank демонстрирует, что прослушиватель событий может быть создан в любое время для 'deviceready' - через 9 секунд после загрузки страницы. Таким образом, не нужно ждать какого-либо события (в том числе 'DOMContentLoaded'.) – Mike