我的目标是根据用户是否登录显示不同的首页。使用同步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", {});
}
答案 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]
时,我检查了初始页面的所有不需要的回复都发生了。