Phonegap / Android pagechange处理程序触发两次

时间:2013-01-26 19:00:19

标签: jquery ajax cordova jquery-mobile

我遇到一个问题,即pagechange处理程序在我的应用程序中针对某些页面转换触发了两次。 在deviceready处理程序中:

$(document).bind("pagechange", onPageChange);

然后是徒手:

var onPageChange = function (event, data) {
    var fromPageId = null;

    //Get the ID of the page we are transitioning to.
    var toPageId = data.toPage.attr("id");

    //Get the ID of the page we are coming from.
    if (data.options.fromPage) {
        fromPageId = data.options.fromPage.attr("id");
    }

    console.log("pagechange to " + toPageId + " from " + fromPageId);

    switch (toPageId){
        ...
    }
}

当应用程序从一个页面转换到下一个页面时,我可以在LogCat中看到onPageChange正在触发两次:

01-26 18:49:50.490: I/Web Console(18244): pagechange to care-plan-view from care-plan-view:25
01-26 18:49:50.490: I/Web Console(18244): pagechange to care-plan-view from care-plans:25

这是他们在日志中出现的顺序,奇怪的是护理计划视图是目标页面,护理计划是起始页面!

这是一个导致页面转换问题的示例链接:

<a data-role="button" data-icon="arrow-r" data-iconpos="right" href="#care-plan-view?id=9e273f31-2672-47fd-9baa-6c35f093a800&amp;name=Sat"><h3>Sat</h3></a>

为什么会发生这种情况的任何想法?

干杯, 唐

1 个答案:

答案 0 :(得分:1)

pagechange 事件发生两次的原因是由于在 changePage 中进行递归调用,而toPage不是jQuery增强型DOM对象。

此递归很危险,因为允许开发人员更改事件中的toPage。如果开发人员在 pagechange 事件处理程序中始终将toPage设置为字符串,则无论它是否为对象,都会产生无限递归循环。

pageload 事件将新页面作为数据对象的页面属性传递(这应该添加到文档中,当前未列出)。因此, pageload 事件可用于访问已加载的页面。

简而言之,这种情况正在发生,因为您通过 pageChange 发送了其他参数。

要解决此问题,请选择另一个页面事件,例如:

event pagebeforecreate
event pagecreate
event pageinit
event pagebeforehide
event pagebeforeshow
event pageremove
event pagehide
event pageshow

有关此问题的更多信息,请访问我的博客 ARTICLE ,只需搜索以下章节:防止多个事件触发。或者你可以找到 HERE