2015-06-05 2 views
3

У меня есть веб-сайт, управляемый ajax, где у меня есть два типа страниц, отображаемых пользователю. Для простоты назовем их MAINPAGE s и SUBPAGE s. MAINPAGE s содержит информацию, и SUBPAGE s - это все формы, в которых пользователь может добавить или изменить существующую информацию, например, MAINPAGE.Сделать браузер удаленным определенным состояниям истории

Если мой сайт посетил пользователь с браузером, совместимым с HTML5, я использую HistoryJS для обновления URL-адреса, когда он совершает навигацию на моем веб-сайте. Давайте pressume следующий пример:

Пользователь вошел мой сайт и переходите к следующим страницам в следующем порядке, и его история выглядит примерно так:

MainPage (1) -> MainPage (2) -> SUBPAGE (1) -> SUBPAGE (2)

Когда пользователь заполняет форму на ПОДСТРАНИЦЫ (2), я хочу, чтобы перенаправить его немедленно к последнему MainPage он Vis ITED. Так, например, когда пользователь заполняет форму, я хотел бы, чтобы пользователи история быть этим:

ГЛАВНАЯ СТРАНИЦА (1) -> ГЛАВНАЯ СТРАНИЦА (2)

Визуально Я в состоянии достичь этого, все работает правильно, но потом, в браузере HTML5, если я нажму на встроенную кнопку возврата в браузере, страница попытается вернуться к SUBPAGE (1), правильное состояние возврата из начальной истории .

Можно ли удалить некоторые из состояний истории, и если да, то как я могу это сделать?

Вот код, я использую до сих пор:

ConverserNavigation.prototype.getPreviousMainAction = function() { 
// NOTE: the code that deals with non HTML5 compatible browsers, 
// was removed because everything works fine there 
var startFrom, found=false; 

if (this.HistoryJS.status==true) startFrom=History.getState().data.id;  
// if browser is HTML5 compatible, get the current state from History object, 
// which is a HistoryJS object 

while ((!found) && (startFrom>0)) // find the last MAINPAGE visited by user 
{ 
    startFrom--; 
    if (this.historyData[startFrom].pageData.page != 'quickactions') found=true; 
} 



if (this.HistoryJS.status==true) History.replaceState({id:startFrom}, this.historyData[startFrom].urlData.title, this.historyData[startFrom].urlData.url); 
// replace the current history state, with the one to where we want to revert 

this.currentNavigationId=startFrom; 
this.back(); // render the ui to navigate back to the previous page, works as intended 
for (var i=this.currentNavigationId;i<this.historyData.length;i++) delete this.historyData[i]; // delete the unused history data 

} 

ответ

1

мне удалось решить эту проблему, изменив мой код следующим образом:

Заменены эту строку:

if (this.HistoryJS.status==true) History.replaceState({id:startFrom}, this.historyData[startFrom].urlData.title, this.historyData[startFrom].urlData.url); 

с этим:

if (this.HistoryJS.status==true) { 
    History.go(goBack); //goBack is the number of states I have to backtrack 
    this.HistoryJS.manualStateChange=false; // telling the browser to not fire my own UI updating functions 
    History.back(); // navigating one more state back in the History object 
    History.pushState({id:startFrom}, this.historyData[startFrom].urlData.title, this.historyData[startFrom].urlData.url); // recreating the original state in the History. 
    this.HistoryJS.manualStateChange=true; // restarting the UI update functions on pop or push events 
} 
Смежные вопросы