Изменить место назначения ссылки с событием pagebeforechange и не допустить его в историю? - PullRequest
2 голосов
/ 11 января 2012

Я работаю над приложением PhoneGap, которое использует jQuery Mobile (jQM). Это приложение имеет области, которые потребуют аутентификации пользователя. Поэтому я использую 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 ]

1 голос
/ 03 апреля 2012

, глядя на 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)
});
0 голосов
/ 20 марта 2014

Решение 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";
    }
});
0 голосов
/ 13 ноября 2012

Решением начальной проблемы может быть что-то вроде:

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

Это прекрасно сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...