1. Описание:
Как ответили в другом вопросе: (https://stackoverflow.com/a/6277304/4718434)
Предоставление URL-адреса в качестве параметра является нестандартной функцией и не будет работать во всех браузерах (а также в Google Chrome). Большинство браузеров принимают только относительное число, например 1 или -1.
НО: почему вы хотите использовать history.go (partUrl)?
- Случай 1: вы просто хотите перейти на страницу в истории посещений пользователей, и вам безразличны кнопки браузера «назад» и «вперед».
- Случай 2: вы хотите смоделировать кнопку «назад».
В случае 1 вы можете использовать куки для сохранения истории.
Но в случае 2 вы можете сохранить историю в cookie-файлах и смоделировать кнопку назад, но если пользователь играет кнопками «назад» и «вперед», мы ничего не можем сделать, и сценарий больше не будет точным.
2. Сценарий:
NOTE : этот скрипт сохраняет временные куки, поэтому, когда пользователь закроет браузер, история очистится. если вы хотите историю перманента, измените функцию setCookie ( используйте эту ссылку ).
в начале каждой страницы (даже страницы, которую вы хотите использовать history.go), добавьте этот скрипт, чтобы сохранить текущий URL во временном cookie:
appendToCookie('history', window.location.href);
для возврата к URL-адресу, который соответствует частичному URL-адресу, добавьте это (также убедитесь, что вы добавили сценарий previus в начале этой страницы (только один раз)):
//last parameter description (searchFullWebsiteHistoryAndGoForwardNotBackward) :
//1. for usage case 1 described above, set it to true
//2. for usage case 2 described above, set it to false
var wentSuccessfull = goBackToHistoryWithPartialUrl('history','/some/partial/Url',false);
if(!wentSuccessfull) console.log('the pattern doesnt exists in history!');
function goBackToHistoryWithPartialUrl(historyCookieName, partialUrl, searchFullWebsiteHistoryAndGoForwardNotBackward){
var history = getArrayFromCookie(historyCookieName);
var historyIndex = null;
for(var i = history.length - 2 ; i >= 0; i--){
if( history[i].indexOf(partialUrl) >-1){
historyIndex = i;
break;
}
}
if(historyIndex !== null){
if (searchFullWebsiteHistoryAndGoForwardNotBackward){
window.location.href = history[historyIndex];
}
else{
var is = [];
for(var i = history.length - 1 ; i >= historyIndex; i--){
is.push(i);
}
removeMultiFromCookie(historyCookieName,is);
//waitForCookieToSet();
window.history.go(historyIndex - (history.length - 1));
}
return true;
}else{
return false;
}
}
вспомогательные функции:
function getSeparator() {
return '_#_SEP_#_';
}
function getArrayFromCookie(cookieName){
var c = getCookie(cookieName);
var a = c.split(getSeparator());
return !c ? [] : a;
}
function appendToCookie(cookieName, value){
var a = getArrayFromCookie(cookieName);
a.push(value);
setCookie(cookieName, a.join(getSeparator()));
}
function removeFromCookie(cookieName, index){
var arr = getArrayFromCookie(cookieName);
arr.splice(index,1);
setCookie(cookieName, arr.join(getSeparator()));
}
function waitForCookieToSet(){
//https://stackoverflow.com/questions/17583250/javascript-delete-cookie-before-reload-or-redirect
var fakeAjax = new XMLHttpRequest();
var anything = fakeAjax.responseText;
fakeAjax.open("GET","ajax_info.txt",false); // file doesn't actually exist
fakeAjax.send();
}
function removeMultiFromCookie(cookieName, indices){
var arr = getArrayFromCookie(cookieName);
for(var i = indices.length - 1 ; i>=0 ; i-- )arr.splice(indices[i],1);
setCookie(cookieName, arr.join(getSeparator()));
}
function setCookie(cname, cvalue) {
document.cookie = cname + "=" + cvalue + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}