我正在使用一个使用jQuery Mobile(jQM)的PhoneGap应用程序。此应用程序具有需要用户进行身份验证的区域。所以我正在使用jQM的pagebeforechange
来确定用户在查看他们请求的页面之前是否需要进行身份验证。如果是这样,我将它们发送到登录页面。
我希望将登录页面保留在jQM的历史记录跟踪之外。也就是说,如果向用户显示登录页面,但决定按“取消”,我希望应用程序返回到上一页,并且不在历史记录中有“下一页” ; “上一页”将位于历史堆栈的顶部。
以下是我处理登录页面重定向的方法:
$(document).bind('pagebeforechange', function(e, data) {
if (typeof data.toPage !== 'string') {
return;
}
if (data.toPage.match(/someRestrictedPage/)) {
data.options.transition = "pop";
data.options.changeHash = false;
data.toPage = "myLogin.html";
}
});
对于我登录页面的取消按钮,我正在做:
$loginCancelButton.bind('click', function() {
var prevPage = $.mobile.urlHistory.getPrev();
if (typeof prevPage !== 'undefined') {
$.mobile.changePage(prevPage.url, {
changeHash: false,
reverse: true,
transition: "pop"
});
}
});
然而,当我这样做时,我最终得到一个$.mobile.urlHistory.stack
,其中包含三个元素:
[ {"index"}, {"login"}, {"index"} ]
如何管理拦截页面更改以在必要时重定向到登录表单,但不创建“无效”导航历史记录?
答案 0 :(得分:1)
查看the jquery docs它提到需要停止pagebeforeload事件。然后调用data.deferred(解析或拒绝)。
尝试将其更改为:
$(document).bind('pagebeforechange', function(e, data) {
if (typeof data.toPage !== 'string') {
return;
}
if (data.toPage.match(/someRestrictedPage/)) {
e.preventDefault()
data.options.transition = "pop";
data.options.changeHash = false;
data.toPage = "myLogin.html";
}
data.deferred.resolve(/* url */, data.options)
});
答案 1 :(得分:0)
初始问题的解决方案可能类似于:
$(document).bind('pagebeforechange', function(e, data) {
if (typeof data.toPage !== 'string') {
return;
}
if (data.toPage.match(/ your regex /gi))
{
if (!check_login())
{
e.preventDefault();
data.options.transition = "pop";
data.options.changeHash = false;
data.toPage = "#SignIn";
$.mobile.changePage("#SignIn");
}
//data.deferred.resolve('#SignIn', data.options);
}
});
这对我很有用。
答案 2 :(得分:0)
VeXii的解决方案似乎对我有用。只需删除
即可data.deferred.resolve('#SignIn', data.options);
和
e.preventDefault();
在jquery mobile 1.3上......
$(document).bind('pagebeforechange', function(e, data) {
if (typeof data.toPage !== 'string') {
return;
}
if (data.toPage.match(/index/)) {
data.options.transition = "pop";
data.options.changeHash = false;
data.toPage = "#login";
}
});