使用pagebeforechange事件更改链接目的地,并将其排除在历史记录之外



我正在开发一个使用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"} ]

如何在必要时拦截页面更改以重定向到登录表单,但不创建"无效"导航历史记录?

查看jquery文档时,它提到pagebeforeload事件需要停止。然后调用data.deferred(resolve或reject)。

尝试将其更改为:

$(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)
});

初始问题的解决方案可能类似于:

$(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);
 }
});

这对我来说很好。

VeXii的解决方案似乎对我有效

data.deferred.resolve('#SignIn', data.options);

e.preventDefault();

在jquery移动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";
    }
});

最新更新