Как мне заставить мою функцию window.history.back() игнорировать href=»#»?

#javascript #html

#javascript #HTML

Вопрос:

Как мне сделать, чтобы моя window.history.back() функция в JS не зависела от того, что у href="#" меня есть в моем HTML?

Потому что теперь, когда я впервые нажимаю href="#" на нижнюю часть своей веб-страницы, я возвращаюсь к началу страницы (как это было задумано). Но затем, когда я нажимаю на window.history.back() функцию, я возвращаюсь к href="#" нижней части моей страницы, когда я действительно хочу перейти на предыдущую страницу.

HTML:

 <a href="#">Back to top</a>
 

 <button class="klick" onclick="goBack()">Back</button>
 

JS:

 function goBack() {window.history.back();}
 

Благодарен за помощь.

С наилучшими пожеланиями Jelly

Ответ №1:

Вы можете заменить текущее местоположение, не добавляя новое состояние в историю сеансов. Вы можете сделать это с помощью метода location.replace, как показано ниже. (В качестве альтернативы вы можете использовать history.replaceState .)

 <a class="toTop" href="#">Back to top</a>

document.addEventListener("click", goToTop);
function goToTop(event){
  if(event.target.classList.contains("toTop")){ // Will work for multiple `.toTop` elements
    event.preventDefault(); // Because this is an anchor element w/ href attribute
    location.replace(location.href); // Navigates without updating history
  }
}
 

Ответ №2:

Я думаю, что самым простым решением было бы сделать так, чтобы нажатие на пустой якорь фактически ничего не добавляло в историю, а просто заменяло текущую запись:

 document.querySelectorAll('a[href="#"]').forEach((link) => {
    link.addEventListener('click', function(event) {
        window.location.replace("#");
        event.preventDefault();
    });
});
 

В качестве альтернативы, поскольку нажатие на привязку фактически не перезагружает страницу, вы можете просто отследить, сколько раз хэш менялся, и вернуться к этой сумме:

 let goBackCount = -1;
let goBack = () => {
    window.history.go(goBackCount);
});
window.addEventListener('hashchange', () => {
    goBackCount--;
});
 

Комментарии:

1. location.replace Опция работает хорошо. Я не уверен, но я думаю, что будет ошибка с goBackCount опцией, при которой, если пользователь перезагружает страницу, история будет заполнена любыми предыдущими щелчками привязки, о которых прослушиватель hashchange не будет знать. (Мы могли бы сохранить эту информацию в хранилище сеансов, но это стало бы излишним.)