【问题标题】:Programmatically change first page jQuery Mobile shows以编程方式更改 jQuery Mobile 显示的第一页
【发布时间】:2014-02-01 21:55:15
【问题描述】:

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

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

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

诀窍在于它并没有完全做到这一点。相反,它会在短时间内显示正确的页面,然后变回占位符。如tutorial on dynamic pages 中所述,在pagechange 中调用preventDefault 并不能阻止这种情况。添加一个计时器解决了这个问题,导致我认为当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", {});
}

【问题讨论】:

  • 使用pagebeforechange,从jQM 1.4开始,你可以使用pagebeforetransitionpagechange 是在页面上触发的最后一个事件,这就是为什么你会看到一个页面一秒钟。
  • @Omar 你理解错了。短暂看到的页面是我想看到的页面,而不是占位符。它只是再次被原始页面覆盖。
  • 第一页是对话框吗?
  • @Omar,占位符不是,但目标首页是,是的。

标签: javascript jquery jquery-mobile preventdefault


【解决方案1】:

如果您使用的是多页面模型,您可以阻止在pagebeforechange 事件中显示任何页面。该事件为每个页面触发两次,一次为即将隐藏的页面,一次为即将显示的页面;但是,在此阶段不会开始任何更改。

它从两个页面收集数据并将它们传递给更改页面函数。收集到的 data 表示为第二个参数 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,因为它不应该从同一个 web 应用中的另一个页面重定向。

Demo

【讨论】:

  • 我已经编辑了我的帖子并包含了我尝试过的最后一个代码,这基本上就是你的建议。 initLogin 启动登录并执行 change 就像在您的示例中一样,所以我基本相同。 preventDefault 仍然不起作用。
  • @RubenVereecken 尝试 retrun false; 但在 changePage 函数之后。
  • 感谢您的善意建议,但仍然存在相同的行为。显示预期的页面,然后再次被原始页面替换(占位符)。
  • 我也有同样的行为。但是我正在使用多个 html 页面...您找到解决此问题的方法了吗?
【解决方案2】:

我遇到了与@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] 时,所有不希望出现的初始页面返回。

【讨论】:

  • 我还建议使用属性 'changeHash' 设置为 false 的 'change' 方法,以防止发生意外的页面更改,特别是如果您正在开发一个面向移动设备的项目。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2017-07-28
  • 2010-09-15
相关资源
最近更新 更多