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

Jquery mobile 使用pagebeforechange事件更改链接目标并将其保留在历史记录之外?,jquery-mobile,cordova,Jquery Mobile,Cordova,我正在开发一个使用jquerymobile(jQM)的PhoneGap应用程序。此应用程序具有需要对用户进行身份验证的区域。因此,我使用jQM的pagebeforechange来确定用户在查看他们请求的页面之前是否需要进行身份验证。如果是这样,我会将它们发送到登录页面 我不想让登录页面进入jQM的历史记录跟踪。也就是说,如果用户看到登录页面,但决定按“取消”,我希望应用程序返回上一页,而不是在历史记录中有一个“下一页”;“上一页”将位于历史堆栈的顶部 以下是我如何处理登录页面重定向: $(doc

我正在开发一个使用jquerymobile(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"} ]
我如何管理拦截页面更改以在必要时重定向到登录表单,但不创建“无效”导航历史记录?

查看它时会提到需要停止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)
});

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

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

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

“我也会对这件事感兴趣的。”“汤米,别抱太大希望了。”。这个问题没有得到任何爱。坐在几乎相同的问题上,我得出了一个结论,我不需要担心它,因为它将被包装在一个“本机”应用程序中。也就是说,用户不会有我无法控制的后退按钮。但知道如何解决这个问题还是很好的。问题还在于,您可能能够从JQM的历史记录中弹出()项,但随后您还必须与浏览器历史记录重新对齐。从文档中可以看到:“绑定到此事件的回调可以调用preventDefault()“我没有处理页面加载请求。我只是在更改要加载的页面。您的解决方案是什么?你能解释一下你做了什么吗?我不知道该怎么办。这个问题已经两年了,我不再从事产生它的项目了。所以我无法验证它是否解决了我遇到的问题。因此,我不知道我是否应该接受它作为一个答案。如果我能把这个问题变成一个社区维基,我会的。
$(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";
    }
});