Корректная регистрация событий в приложении PhoneGap + jQuery Mobile
Я пытаюсь определить правильный способ зарегистрировать как события инициализации (jQuery-style) для 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
Ответы
Ответ 1
Пожалуйста, придерживайтесь последнего, потому что это рекомендуется PhoneGap, ваш первый подход, вероятно, не работает, потому что вы слишком долго связываете deviceready
(то есть: он уже запущен перед вашей привязкой). То потому что pageinit
уволен относительно поздно.
Что вы можете сделать, это способ jQuery:
$(window).load(function() {
$(document).bind('deviceready', function () {
// ...
});
});
Ответ 2
В этом случае я считаю использование отложенных объектов более чистым/безопасным. Это то, что я обычно делаю:
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
});
Ответ 3
Я бы пошел дальше с примером Майкла и инициировал пользовательское событие 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