15 ответов:
короткий ответ: Вы не можете.
технически существует точный способ, который будет проверять свойство:
history.previousоднако, это не будет работать. проблема в том, что в большинстве браузеров это считается нарушением безопасности и обычно просто возвращает undefined.
history.lengthэто свойство, которое другие предложили...
, длина не работает полностью, потому что это не так укажите здесь в истории вы. Кроме того, он не всегда начинается с одного и того же номера. Например, браузер, не настроенный на целевую страницу, начинается с 0, а другой браузер, использующий страницу langing, - с 1.
большую часть времени добавляется ссылка, которая вызывает:
history.back();или
history.go(-1);и просто ожидать, что если вы не можете вернуться, нажав на ссылку ничего не делает.
есть еще один способ проверить-проверить реферер. На первой странице обычно будет пустой реферер...
if (document.referrer == "") { window.close() } else { history.back() }
мой код позволяет браузеру вернуться на одну страницу, и если это не удается, он загружает резервный url. Он также обнаруживает изменения хэштегов.
когда кнопка назад не была доступна, резервный url-адрес будет загружен через 500 мс, поэтому браузер имеет достаточно времени для загрузки предыдущей страницы. Загрузка резервного url-адреса сразу после
window.history.go(-1);заставит браузер использовать резервный url, потому что сценарий js еще не остановился.function historyBackWFallback(fallbackUrl) { fallbackUrl = fallbackUrl || '/'; var prevPage = window.location.href; window.history.go(-1); setTimeout(function(){ if (window.location.href == prevPage) { window.location.href = fallbackUrl; } }, 500); }
это, кажется, сделать трюк:
function goBackOrClose() { window.history.back(); window.close(); //or if you are not interested in closing the window, do something else here //e.g. theBrowserCantGoBack(); }история звонков.назад() и затем окно.закрывать.)( Если браузер сможет вернуться в историю, он не сможет перейти к следующему заявлению. Если он не сможет вернуться, то закроет окно.
однако обратите внимание, что если страница была достигнута путем ввода url-адреса, то firefox не позволит скрипту закрыть окно.
вы не можете напрямую проверить, можно ли использовать кнопку "Назад". Вы можете посмотреть
history.length>0, но это будет справедливо, если есть страницы вперед текущей страницы, а также. Вы можете быть только обязательно что кнопка Назад непригодна для использования, когдаhistory.length===0.если это не достаточно хорошо, все, что вы можете сделать, это позвонить
history.back()и, если ваша страница все еще загружается после этого, кнопка Назад недоступна! Конечно, это означает, что если кнопка Назад и доступно, вы только что перешли от страницы. Вы не можете отменить навигацию вonunload, Так что все, что вы можете сделать, чтобы остановить спину на самом деле происходит, чтобы вернуть что-то изonbeforeunload, что приведет к появлению большого раздражающего приглашения. Это того не стоит.на самом деле это обычно очень плохая идея, чтобы делать что-нибудь с историей. Навигация по истории предназначена для браузера chrome, а не для веб-страниц. Добавление ссылок "вернуться" обычно вызывает больше путаницы пользователей чем это стоит.
вот как я это сделал.
я использовал 'beforeunload' событие для установки логического значения. Затем я установил тайм-аут, чтобы посмотреть, если "beforeunload" выстрелил.
var $window = $(window), $trigger = $('.select_your_link'), fallback = 'your_fallback_url'; hasHistory = false; $window.on('beforeunload', function(){ hasHistory = true; }); $trigger.on('click', function(){ window.history.go(-1); setTimeout(function(){ if (!hasHistory){ window.location.href = fallback; } }, 200); return false; });Кажется, работает в основных браузерах (проверено FF, Chrome, IE11 до сих пор).
history.lengthбесполезно, так как он не показывает, Может ли пользователь вернуться в историю. Также разные браузеры используют начальные значения 0 или 1 - это зависит от браузера.рабочее решение заключается в использовании
$(window).on('beforeunload'событие, но я не уверен, что он будет работать, если страница загружается через ajax и использует pushState для изменения истории окна.поэтому я использовал следующее решение:
var currentUrl = window.location.href; window.history.back(); setTimeout(function(){ // if location was not changed in 100 ms, then there is no history back if(currentUrl === window.location.href){ // redirect to site root window.location.href = '/'; } }, 100);
есть фрагмент, который я использую в моих проектах:
function back(url) { if (history.length > 2) { // if history is not empty, go back: window.History.back(); } else if (url) { // go to specified fallback url: window.History.replaceState(null, null, url); } else { // go home: window.History.replaceState(null, null, '/'); } }FYI: я использую история.js Управление историей браузера.
зачем сравнивать историю.длина до числа 2?
потому что стартовая страница Chrome считается первым элементом в истории браузера.
есть несколько возможностей
history.lengthи поведение пользователя:
- пользователь открывает новая вкладка пустая в браузере, а затем запускает страницу.
history.length = 2и мы хотим отключитьback()в этом случае, потому что пользователь перейдет на пустую вкладку.- пользователь открывает страницу в новая вкладка нажав на ссылку где-то раньше.
history.length = 1и снова мы хотим отключитьback()метод.- и, наконец, пользователь попадает на текущую страницу после перезагрузка несколько страниц.
history.length > 2и теперьback()можно включить.
Примечание: I опустить случай, когда пользователь попадает на текущую страницу после нажатия ссылки с внешнего сайта без
target="_blank".примечание 2:
document.referrerпуст, когда вы открываете сайт, введя его адрес, а также когда сайт использует ajax для загрузки подстраниц, поэтому я прекратил проверку этого значения в первом случае.
будьте осторожны с
window.history.lengthпотому что она включает в себя также записи дляwindow.history.forward()так что у вас может быть может
window.history.lengthс более чем 1 запись, но не историю записи. Это означает, что ничего не происходит, если вы стреляетеwindow.history.back()
Я придумал следующий подход. Он использует событие onbeforeunload, чтобы определить, начинает ли браузер покидать страницу или нет. Если это не произойдет в определенный промежуток времени, он просто перенаправит на резервный вариант.
var goBack = function goBack(fallback){ var useFallback = true; window.addEventListener("beforeunload", function(){ useFallback = false; }); window.history.back(); setTimeout(function(){ if (useFallback){ window.location.href = fallback; } }, 100); }вы можете вызвать эту функцию с помощью
goBack("fallback.example.org").
браузер имеет кнопку назад и вперед. Я придумываю решение по этому вопросу. но это повлияет на действия браузера вперед и вызвать ошибку с некоторыми браузерами.
это работает так: если браузер открывает новый url, который никогда не открывался, история.длина будет расти.
Так что вы можете изменить хэш, как
location.href = '#__transfer__' + new Date().getTime()чтобы получить никогда не показанный url, а затем историю.длина получит истинную длину.
var realHistoryLength = history.length - 1но, это не всегда хорошо работает, и я не знаю, почему, особенно когда url автоматически прыгать быстро.
есть еще возле идеальное решение, взятое из еще один такой ответ:
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.
Я не уверен, что это работает, и это полностью непроверено, но попробуйте это:
<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">EDIT:
что вы также можете сделать, это исследовать, какие браузеры поддерживают функцию back (Я думаю, что все они делают) и использовать стандартный объект обнаружения браузера JavaScript, найденный и подробно описанный на на этой странице. Тогда у вас может быть 2 разных страницы: одна для" хороших браузеров", совместимых с кнопкой Назад и один для "плохих браузеров" говорит им идти обновить свой браузер

Comments