以编程方式更改第一页jQuery Mobile节目

时间:2014-02-01 21:55:15

标签: javascript jquery jquery-mobile preventdefault

我的目标是根据用户是否登录显示不同的首页。使用同步Ajax调用进行登录检查,其结果决定是显示登录对话框还是第一个用户页面。

执行此操作的常规方法是设置$.mobile.autoInitialize = false,然后以编程方式初始化,如this question的答案中所述。由于某些原因,这不起作用,而是每次都会加载另一个页面。

我决定放弃这种方式尝试不同的parcour。我现在使用一个占位符,空的启动页面,只要登录检查需要显示。登录后检查它应该自动更改。这是通过调用一个函数来完成的,该函数执行引入此启动页面的pagechange事件上的身份验证所需的ajax调用。该功能还负责更改结果页面。

诀窍在于它不会那样做。相反,它会在短时间内显示正确的页面,然后更改回占位符。在preventDefault中调用pagechange并未阻止此操作,如tutorial on dynamic pages中所述。添加一个计时器修复了这个问题,导致我认为当pageshow被解雇时占位符不完整(根据页面事件的this page),或者初始页面加载的一些副作用仍然徘徊。

我真的很无知如何解决这个看似微不足道但又很麻烦的问题。是什么导致这个额外的更改回到初始页面?另外,如果我拦截初始页面加载的方法是错误的,那么正确的方法是什么呢?

我使用jQuery Mobile 1.4.0和jQuery 1.10.2(之前的1.8.3)。

编辑:以下是我在此处发布问题之前的最后一次尝试的代码。它不起作用:preventDefault不会阻止转换到占位符页面。

$(document).on("pagebeforechange", function(e, data) {
    if (typeof(data.options.fromPage) === "undefined" && data.toPage[0].id === "startup") {
        e.preventDefault();
        initLogin();
    }
});

function initLogin() {
    // ... Login logic
    if (!loggedIn) // Pseudo
        $('body').pagecontainer("change", "#login", {});
}

2 个答案:

答案 0 :(得分:0)

如果您使用的是多页模型,则可以阻止在pagebeforechange事件上显示任何页面。此事件针对每个页面触发两次,对于即将隐藏的页面触发一次,对于即将显示的页面触发一次;但是,在这个阶段没有开始变化。

从两个页面收集数据并将其传递给更改页面功能。收集的数据表示为第二个参数 object ,可以在触发事件后检索。

对象需要的是两个属性.toPage.options.fromPage。根据这些属性值,您可以决定是显示第一页还是立即移动到另一页。

var logged = false; /* for demo */

$(document).on("pagebeforechange", function (e, data) {

    if (!logged && data.toPage[0].id == "homePage" && typeof data.options.fromPage == "undefined") {
        /* immediately show login dialig */
        $.mobile.pageContainer.pagecontainer("change", "#loginDialog", {
            transition: "flip"
        });

        e.preventDefault(); /* this will stop showing first page */
    }
});
  • data.toPage[0].id值是DOM id 中的第一页。

  • data.options.fromPage应为undefined,因为它不应从同一个网络应用中的其他网页重定向。

  

<强> Demo

答案 1 :(得分:0)

我遇到了与@RubenVereecken描述的问题相同的问题,也就是说,一旦完成第二页的操作,就会回到初始页面。事实上,他提出了一个问题“是什么导致这个额外的变化回到初始页面?”它还没有被回复。 不幸的是,我不知道原因,因为我还没有找到JQM-1.4.2中的页面事件顺序如何工作,但幸运的是,@ Omar建议的解决方法对我有用。

这不是完全相同的代码,但是一般的想法在阻止回到初始页面时起作用。我的代码如下:

$(document).on("pagebeforechange", function(event, data) {
if ( typeof (data.toPage) == "string") {
       if (data.toPage.indexOf("#") == -1 && typeof (data.options.fromPage[0].id) == string") {
          event.preventDefault();         
       }      
}});

条件data.toPage.indexOf("#") == -1是因为当我将'.toPage'属性设置为[http://localhost/.../index.html]时,我检查了初始页面的所有不需要的回复都发生了。