Правильная регистрация событий в приложении «PhoneGap + jQuery Mobile» - PullRequest
15 голосов
/ 26 ноября 2011

Я пытаюсь определить правильный способ регистрации обоих событий инициализации (в стиле jQuery) для PhoneGap и jQuery Mobile в Android приложении.

Изучив документацию, я придумал следующее:

$('#index-page').live('pageinit', function () { // <-- fires
    $(document).bind('deviceready', function () { // <-- !fires
        // ...
    });
});

«Внешнее» событие (pageinit) срабатывает, а «внутреннее» (deviceready) не ...

Хотя этот тип регистрации событий работает отлично:

window.addEventListener('load', function () {
    document.addEventListener('deviceready', function () {
        // ...
    }, false);
}, false);

Кто-нибудь может объяснить, что не так с регистрацией событий первого типа? Какой тип лучше?


Требования:

  • PhoneGap v1.2
  • jQuery Mobile v1.0rc2
  • Eclipse v3.7.1

Ответы [ 3 ]

14 голосов
/ 06 апреля 2012

Я считаю использование отложенных объектов чище / безопаснее в этом случае.Это то, что я обычно делаю:

var jqmReady = $.Deferred();
var pgReady = $.Deferred();

// jqm ready
$(document).bind("mobileinit", jqmReady.resolve);

// phonegap ready
document.addEventListener("deviceready", pgReady.resolve, false);

// all ready :)
$.when(jqmReady, pgReady).then(function () {
  // do your thing
});
7 голосов
/ 19 июля 2012

Я бы пошел дальше с примером Майкла и вызвал пользовательское событие JavaScript «PG_pageinit». Это сработает после того, как оба события ('pageinit', 'deviceready') были запущены. Таким образом, вам нужно всего лишь изменить имя зарегистрированного события в ваших (уже написанных) внешних файлах JavaScript.

Итак, используя код Майкла (с небольшим изменением события 'mobileinit' на 'pageinit'):

var jqmReady = $.Deferred(),
pgReady = $.Deferred();

// jqm page is ready
$(document).bind("pageinit", jqmReady.resolve);

// phonegap ready
document.addEventListener("deviceready", pgReady.resolve, false);

// all ready, throw a custom 'PG_pageinit' event
$.when(jqmReady, pgReady).then(function () {
  $(document).trigger("PG_pageinit"); 
});

А в других ваших файлах JavaScript, когда вы хотите зарегистрировать это новое событие, используйте это:

$(document).bind("PG_pageinit", function(){
  alert('PG_pageinit was just fired!');    
  // do your thing...
});

Проверено на Android 2.3, Cordova 1.9.0

6 голосов
/ 26 ноября 2011

Пожалуйста, придерживайтесь последнего, потому что это рекомендовано PhoneGap, ваш первый подход, вероятно, не работает, потому что вы связываете deviceready слишком поздно (то есть: оно уже запущено до вашего связывания). Это потому, что pageinit уволен относительно поздно.

Что вы можете сделать, это способ jQuery:

$(window).load(function() {
    $(document).bind('deviceready', function () { 
        // ...
    });
});
...