Как проверить, может ли пользователь вернуться в историю браузера или нет - PullRequest
121 голосов
/ 28 августа 2010

Я хочу использовать JavaScript, чтобы увидеть, есть ли история или нет, я имею в виду, доступна ли кнопка назад в браузере или нет.

Ответы [ 17 ]

1 голос
/ 31 октября 2017

Существует еще одно почти идеальное решение, взятое из другого ответа SO :

if( (1 < history.length) && document.referrer ) {
    history.back();
}
else {
    // If you can't go back in history, you could perhaps close the window ?
    window.close();
}

Кто-то сообщил, что он не работает при использовании target="_blank", но мне кажется, что он работает на Chrome.

0 голосов
/ 04 мая 2017

браузер имеет кнопку назад и вперед.Я придумаю решение по этому вопросу.но это повлияет на действие браузера вперед и вызовет ошибку в некоторых браузерах.

Это работает так: если браузер откроет новый URL, который никогда не открывался, то значение history.length будет увеличиваться.

, чтобы вы могли изменить хеш, например

  location.href = '#__transfer__' + new Date().getTime() 

, чтобы получить никогда не показанный URL, тогда history.length получит истинную длину.

  var realHistoryLength = history.length - 1

но, этоне всегда хорошо работает, и я не знаю, почему, особенно когда URL автоматически переключается быстро.

0 голосов
/ 22 января 2016
var fallbackUrl = "home.php";
if(history.back() === undefined)
    window.location.href = fallbackUrl;
0 голосов
/ 28 августа 2010

Проверьте, равен ли window.history.length 0.

0 голосов
/ 27 марта 2019

Решение

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  }
}

Объяснение

window.location.pathname даст вам текущий URI.Например, https://domain/question/1234/i-have-a-problem даст /question/1234/i-have-a-problem.См. Документацию о window.location для получения дополнительной информации.

Далее, вызов split() даст нам все фрагменты этого URI.так что если мы возьмем наш предыдущий URI, у нас будет что-то вроде ["", "question", "1234", "i-have-a-problem"].См. Документацию о String.prototype.split () для получения дополнительной информации.

Здесь вызывается filter(), чтобы отфильтровать пустую строку, созданную обратной косой чертой.Он будет возвращать только фрагмент URI, длина которого больше 1 (непустая строка).Так что у нас было бы что-то вроде ["question", "1234", "i-have-a-question"].Это можно было бы написать так:

'use strict';
window.location.pathname.split('/').filter(function(fragment) {
  return fragment.length > 0;
});

См. Документацию о Array.prototype.filter () и Разрушающее присваивание для получения дополнительной информации.

Теперь, если пользователь пытается вернуться, находясь на https://domain/, мы не будем запускать оператор if и поэтому не будем запускать метод window.history.back(), чтобы пользователь оставался на нашем веб-сайте.Этот URL будет эквивалентен [], который имеет длину 0, а 0 > 0 имеет значение false.Следовательно, молча терпит неудачу.Конечно, вы можете что-то зарегистрировать или выполнить другое действие, если хотите.

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  } else {
    alert('You cannot go back any further...');
  }
}

Ограничения

Конечно, это решение не будет работать, если браузер не поддерживает History API.Ознакомьтесь с документацией, чтобы узнать больше об этом, прежде чем использовать это решение.

0 голосов
/ 17 июня 2019

Опираясь на ответ здесь и здесь . Я думаю, что более убедительный ответ - просто проверить, является ли это новой страницей в новой вкладке.

Если история страницы более одного, то мы можем вернуться на страницу, предшествующую текущей. Если нет, вкладка является вновь открытой вкладкой, и нам нужно создать новую вкладку.

Иными словами, к связанным ответам мы не проверяем referrer, так как на новой вкладке все еще будет реферер.

if( (1 < history.length) {
    history.back();
}
else {
    window.close();
}
0 голосов
/ 28 августа 2010

Я не уверен, что это работает, и это полностью не проверено, но попробуйте это:

<script type="text/javascript">

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

    if (history.length > 0) { //if there is a history...
        document.getElementsByTagName('button')[].onclick="goBack()"; //assign function "goBack()" to all buttons onClick
    } else {
        die();
    }
</script>

И где-то в HTML:

<button value="Button1"> //These buttons have no action
<button value="Button2">

РЕДАКТИРОВАТЬ:

Что вы также можете сделать, это исследовать, какие браузеры поддерживают функцию возврата (я думаю, что они все это делают) и использовать стандартный объект обнаружения браузера JavaScript, который был найден и подробно описан на этой странице .Тогда у вас может быть две разные страницы: одна для «хороших браузеров», совместимых с кнопкой «Назад», и одна для «плохих браузеров», предлагающих обновить их браузер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...