Ответ 1
В принципе, у вас есть два "горшка" с историей, с которыми вам нужно вмешаться. Браузер и JQM.
JQM urlHistory
Вы можете очень легко изменить JQMs urlHistory. Из кода JQM:
urlHistory = {
// Array of pages that are visited during a single page load.
// Each has a url and optional transition, title, and pageUrl
// (which represents the file path, in cases where URL is obscured, such as dialogs)
stack: [],
// maintain an index number for the active page in the stack
activeIndex: 0,
// get active
getActive: function () {
return urlHistory.stack[urlHistory.activeIndex];
},
getPrev: function () {
return urlHistory.stack[urlHistory.activeIndex - 1];
},
getNext: function () {
return urlHistory.stack[urlHistory.activeIndex + 1];
},
// addNew is used whenever a new page is added
addNew: function (url, transition, title, pageUrl, role) {
// if there forward history, wipe it
if (urlHistory.getNext()) {
urlHistory.clearForward();
}
urlHistory.stack.push({
url: url,
transition: transition,
title: title,
pageUrl: pageUrl,
role: role
});
urlHistory.activeIndex = urlHistory.stack.length - 1;
},
//wipe urls ahead of active index
clearForward: function () {
urlHistory.stack = urlHistory.stack.slice(0, urlHistory.activeIndex + 1);
}
};
Таким образом, все вышеперечисленные функции доступны и могут быть вызваны, например, следующим образом:
$.mobile.urlHistory.clearForward();
Чтобы отслеживать свою историю, поместите это где-нибудь и выслушайте страницуChange (после завершения переходов), чтобы увидеть, что находится внутри urlHistory:
$(document).on('pagechange', 'div:jqmData(role="page")', function(){
console.log($.mobile.urlHistory.stack);
});
Оттуда вы можете начать видеть, что должно быть в истории, и очистить его по мере необходимости.
Я использую это для своего собственного слоя навигации, чтобы изменить то, что хранится в urlHistory, и что не следует хранить. Синхронизация с браузером - сложная часть...
При синхронизации с браузером:
В моем навигационном слое я удаляю только двойные записи из urlHistory, поэтому всегда нужно перейти к странице (а не к двум), когда вы нажмете кнопку назад. В вашем случае вы предположительно должны иметь 4 записи в истории браузера, но если вы удалите 2 записи из JQM urlHistory, у вас будет две страницы ", чтобы не попасть в, когда нажата кнопка" Назад ". Поэтому, если ваша история браузера выглядит так:
www.google.com
www.somePage.com
www.YOUR_APP.com = page1
page2
page3
page4
И вы удалите page2 и page3, нажав кнопку "Назад", вы получите:
1st back-click = page4 > page1
2nd back-click = page1 > www.somePage.com [because you removed page3]
3rd back-click = www.somePage.com > www.google.com [because you removed page2]
Теоретическое обходное решение будет:
- держите счетчик, как "глубоко" вы переходите на страницу
- удалите страницы из JQM urlHistory и получите значение "jump" = counter-deletedPages
- на следующем обратном щелчке браузера, выполните прыжок x window.history(назад) и разрешите только один переход JQM. Вы url разворачиваете страницу4 > page3 > page2 > page1 за один шаг, и вы разрешаете JQM делать один переход со страницы4 на страницу1
- проверьте, что в urlHistory и очистите после вашей "тройной обратной".
Помните, что это не оптимальное решение, и вам нужно учитывать много вещей (пользователь щелкает куда-то еще, прежде чем возвращаться и т.д.). Я пытался навсегда получить что-то подобное, чтобы работать в более сложной настройке и в конечном итоге просто прекратил ее использовать, потому что он никогда не работал так, как должен. Но для более простой настройки это может очень хорошо работать.