0

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

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

然后是hander:

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>

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

干杯,唐

4

1 回答 1

1

事件发生两次的原因pagechange是由于在changePagetoPage 不是 jQuery 增强 DOM 对象时的递归调用。

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

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

简而言之,这是因为您正在通过pageChange.

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

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

关于这个问题的更多信息可以在我的博客文章中找到,只需搜索章节:防止多事件触发。或者你可以在这里找到它。

于 2013-01-26T19:45:05.907 回答