【发布时间】: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开始,你可以使用pagebeforetransition。pagechange是在页面上触发的最后一个事件,这就是为什么你会看到一个页面一秒钟。 -
@Omar 你理解错了。短暂看到的页面是我想看到的页面,而不是占位符。它只是再次被原始页面覆盖。
-
第一页是对话框吗?
-
@Omar,占位符不是,但目标首页是,是的。
标签: javascript jquery jquery-mobile preventdefault