使用pagebeforechange事件更改链接目标并将其保留在历史记录之外?

时间:2012-01-11 17:58:26

标签: jquery-mobile cordova

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

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

3 个答案:

答案 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";
    }
});