History.go («частичный URL») - PullRequest
2 голосов
/ 04 июня 2019

Я хочу, чтобы моя кнопка вернулась к последнему URL-адресу с / furniture / в нем.

В документации w3schools указано:

Параметр может быть числом.который идет по URL в пределах определенной позиции (-1 - назад на одну страницу, 1 - на одну страницу вперед) или строку.Строка должна быть частичным или полным URL, и функция перейдет к первому URL, который соответствует строке.

https://www.w3schools.com/jsref/met_his_go.asp

Поскольку это Squarespace, я должен использоватьСлушатель событий для добавления пользовательских функций к кнопке Squarespace.

<script>
  window.onload=function(){
    document.getElementsByClassName("sqs-block-button-element").addEventListener("click", goBack);

    function goBack() {
    window.history.go("https://uk5-shop.com/furniture/");
    }
  }
</script>

Насколько я понимаю, это должно отослать меня назад к любому продукту в категории мебели, которую я последний раз посещал, например https://uk5 -shop.com/furniture/chair или https://uk5 -shop.com / мебель / кровать .Это не тот случай.

Я где-то читал, что это может быть прекращено, но тогда почему в большинстве документов?

1 Ответ

2 голосов
/ 04 июня 2019

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 "";
}
...