在“PhoneGap + jQuery Mobile”应用程序中正确注册事件

Posted

技术标签:

【中文标题】在“PhoneGap + jQuery Mobile”应用程序中正确注册事件【英文标题】:Correct event registration in the 'PhoneGap + jQuery Mobile' application 【发布时间】:2012-01-06 16:48:24 【问题描述】:

我正在尝试定义在 android 中为 PhoneGapjQuery Mobile 注册初始化事件(jQuery 样式)的正确方法应用。

研究文档后,我想出了以下内容:

$('#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】:

我发现在这种情况下使用延迟对象更清洁/更安全。这是我通常做的:

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
);

【讨论】:

感谢您的建议!我也试试。 这比 Cordova/PhoneGap 使用的“标准”回调混乱好多了。 理想情况下,我会在 index.html 中执行此操作。正确的?另外,不是 /* 做你的事 */ 我想调用一个 JS 文件,该文件包含我的应用程序的所有实时或延迟事件,这样我就可以有一个中心位置,所有事件都由我注册。可能吗?这是一个好的设计吗?如果是,我该如何实现?我尝试使用 $.getScript 但这会为我的应用程序呈现一个空白页面。请提出建议。 @Mustafa 您可以使用闭包,并创建一个初始化所有内容的模块。然后代替 /* 做你的事 */ 你打电话给yourModule.yourInitMethod(); 我对 index.html 中的所有 JS 进行了一些更改(读取清理),现在 getScript 可以工作了。谢谢你的回答。【参考方案2】:

我会在 Michael 的示例中走得更远,并触发自定义的 'PG_pageinit' javascript 事件。这将在两个事件('pageinit'、'deviceready')被触发后触发。这样,您只需在(已编写的)外部 JavaScript 文件中更改已注册事件的名称。

所以,使用 Michael 的代码(从 '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 上测试

【讨论】:

如果我将$(document).on('event') 放在 //do your thing 中,JQM 事件永远不会触发?【参考方案3】:

请坚持最后一个,因为这是 PhoneGap 推荐的,您的第一种方法可能不起作用,因为您绑定 deviceready 太晚了(即:它在您绑定之前已被触发)。那是因为pageinit 被解雇比较晚。

你可以做的是jQuery方式:

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

【讨论】:

坚持 W3C 事件注册模型效果很好...至于建议的 jQuery 样式,它对我不起作用:deviceready 事件不会触发...感谢您的建议!

以上是关于在“PhoneGap + jQuery Mobile”应用程序中正确注册事件的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据