Я хочу использовать JavaScript, чтобы увидеть, есть ли история или нет, я имею в виду, доступна ли кнопка назад в браузере или нет.
javascript
Райан
источник
источник
Ответы:
Краткий ответ: вы не можете.
Технически существует точный способ, которым будет проверяться свойство:
Однако это не сработает. Проблема в том, что в большинстве браузеров это считается нарушением безопасности и обычно просто возвращает undefined .
Это свойство, которое предложили другие ...
Однако длина не работает полностью, потому что она не указывает, где в истории вы находитесь. Кроме того, он не всегда начинается с одного номера. Например, браузер, для которого не настроена целевая страница, начинается с 0, а другой браузер, использующий целевую страницу, - с 1.
Большую часть времени добавляется ссылка, которая вызывает:
или
и просто ожидалось, что если вы не сможете вернуться назад, то нажатие на ссылку ничего не даст
источник
Есть еще один способ проверить - проверить реферер. На первой странице обычно будет пустой реферер ...
источник
Мой код позволяет браузеру вернуться на одну страницу назад, и в случае неудачи он загружает запасной URL. Он также обнаруживает изменения хэштегов.
Если кнопка «Назад» недоступна, резервный URL-адрес будет загружен через 500 мс, поэтому у браузера будет достаточно времени для загрузки предыдущей страницы. Загрузка резервной ссылки сразу после
window.history.go(-1);
этого заставит браузер использовать запасную ссылку, потому что сценарий js еще не остановлен.источник
chrome://newtab
и, таким образом, можете вернуться в историю.Вот как я это сделал.
Я использовал событие beforeunload для установки логического значения. Затем я установил тайм-аут, чтобы посмотреть, сработал ли «beforeunload».
Кажется, работает в основных браузерах (до сих пор тестировал FF, Chrome, IE11).
источник
window.location.href = fallback
на,window.close()
и это тоже работает.это, кажется, делает трюк:
Вызовите history.back (), а затем window.close (). Если браузер сможет вернуться в историю, он не сможет перейти к следующему утверждению. Если он не сможет вернуться, он закроет окно.
Тем не менее, обратите внимание, что если страница была достигнута путем ввода URL-адреса, то Firefox не позволит сценарию закрыть окно.
источник
window.close()
Считается угрозой безопасности во многих современных браузерах. Некоторые просто не позволят тебе это сделать.В моих проектах есть фрагмент:
К вашему сведению: я использую History.js для управления историей браузера.
Зачем сравнивать history.length с номером 2?
Потому что стартовая страница Chrome считается первым элементом в истории браузера.
Есть несколько возможностей
history.length
и поведения пользователя:history.length = 2
и мы хотим отключитьback()
в этом случае, потому что пользователь перейдет на пустую вкладку.history.length = 1
и снова мы хотим отключитьback()
метод.history.length > 2
и теперьback()
можно включить.Примечание: я опускаю случай, когда пользователь попадает на текущую страницу после нажатия на ссылку с внешнего сайта без
target="_blank"
.Примечание 2:
document.referrer
пусто, когда вы открываете веб-сайт путем ввода его адреса, а также когда веб-сайт использует ajax для загрузки подстраниц, поэтому я прекратил проверку этого значения в первом случае.источник
Будьте осторожны,
window.history.length
потому что он включает в себя также записи дляwindow.history.forward()
Таким образом, у вас может быть
window.history.length
более 1 записей, но нет записей назад. Это означает, что ничего не произойдет, если вы стреляетеwindow.history.back()
источник
Вы не можете напрямую проверить, используется ли кнопка «Назад». Вы можете посмотреть
history.length>0
, но это будет справедливо, если есть страницы впереди текущей страницы. Вы можете быть уверены, что кнопка «Назад» не работает, когдаhistory.length===0
.Если это не достаточно хорошо, все, что вы можете сделать, это позвонить,
history.back()
и, если ваша страница все еще загружается после этого, кнопка Назад недоступна! Конечно , это означает , если кнопка назад находится в наличии, вы просто переходите от страницы. Вы не можете отменить навигацию в системеonunload
, поэтому все, что вы можете сделать, чтобы остановить возвращение, - это вернуть что-тоonbeforeunload
, что приведет к появлению большого раздражающего запроса. Это того не стоит.На самом деле это обычно действительно плохая идея - делать что-то с историей. История навигации для браузера Chrome, а не веб-страниц. Добавление ссылок «назад» обычно вызывает больше путаницы у пользователя, чем оно того стоит.
источник
1
!0
Был brainfart, я думал , что браузеры всегда будет реагировать с1
или более. Оказывается, Opera и IE думают иначе - хороший улов.history.length
бесполезен, так как не показывает, может ли пользователь вернуться в историю. Также разные браузеры используют начальные значения 0 или 1 - это зависит от браузера.Рабочим решением является использование
$(window).on('beforeunload'
события, но я не уверен, что оно будет работать, если страница загружается через ajax и использует pushState для изменения истории окна.Поэтому я использовал следующее решение:
источник
Я придумал следующий подход. Он использует событие onbeforeunload, чтобы определить, начинает ли браузер покидать страницу или нет. Если этого не произойдет в определенный промежуток времени, он просто перенаправит на запасной вариант.
Вы можете вызвать эту функцию, используя
goBack("fallback.example.org")
.источник
windows.onbeforeunload
на прослушиватель событий,window.addEventListener("beforeunload", function (event) { useFallback = false; });
чтобы он не перезаписывал window.onbeforeunload.Опираясь на ответ здесь и здесь . Я думаю, что более убедительный ответ - просто проверить, является ли это новой страницей в новой вкладке.
Если история страницы более одного, то мы можем вернуться на страницу, предшествующую текущей странице. Если нет, то вкладка является вновь открытой вкладкой, и нам нужно создать новую вкладку.
Иными словами, к ответам, связанным, мы не проверяем,
referrer
поскольку на новой вкладке все еще будет реферер.источник
Есть еще одно почти идеальное решение, взятое из другого SO ответа :
Кто-то сообщил, что он не работает при использовании,
target="_blank"
но, похоже, у меня работает на Chrome.источник
в браузере есть кнопка «назад» и «вперед». Я придумаю решение по этому вопросу. но это повлияет на действие браузера вперед и вызовет ошибку в некоторых браузерах.
Это работает так: если браузер откроет новый URL, который никогда не открывался, то history.length будет расти.
так что вы можете изменить хэш, как
чтобы получить никогда не показанный URL, то history.length получит истинную длину.
но, это не всегда работает хорошо, и я не знаю почему, особенно когда url auto jump быстро.
источник
Я пытался найти решение, и это лучшее, что я мог получить (но работает отлично, и это самое простое решение, которое я нашел даже здесь).
В моем случае я хотел вернуться к истории с помощью кнопки «Назад», но если первая страница, которую открыл пользователь, была подстраницей моего приложения, она вернулась бы на главную страницу.
Решением было, как только приложение загрузилось, я просто заменил состояние истории:
Таким образом, мне просто нужно проверить,
history.state.root
прежде чем вернуться. Если это правда, я делаю вместо истории замену:источник
источник
history.back()
естьundefined
только на пустой вкладкеРешение
Explaination
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"]
. Это можно было бы написать так:См. Документацию о Array.prototype.filter () и назначении Destructuring для получения дополнительной информации.
Теперь, если пользователь пытается вернуться во время работы
https://domain/
, мы не будем запускать оператор if и поэтому неwindow.history.back()
будем запускать метод, чтобы пользователь оставался на нашем веб-сайте. Этот URL будет эквивалентен тому,[]
который имеет длину0
, и0 > 0
является ложным. Следовательно, молча терпит неудачу. Конечно, вы можете записать что-нибудь или выполнить другое действие, если хотите.Ограничения
Конечно, это решение не будет работать, если браузер не поддерживает History API . Проверьте документацию, чтобы узнать больше об этом, прежде чем использовать это решение.
источник
Я не уверен, что это работает, и это полностью не проверено, но попробуйте это:
И где-то в HTML:
РЕДАКТИРОВАТЬ:
Вы также можете исследовать, какие браузеры поддерживают функцию back (я думаю, что все они поддерживают) и использовать стандартный объект обнаружения браузера JavaScript, который подробно описан на этой странице . Тогда у вас может быть две разные страницы: одна для «хороших браузеров», совместимых с кнопкой «Назад», и одна для «плохих браузеров», предлагающих обновить их браузер.
источник
history.back
это функция. Вы хотите проверить,history.length > 0
вернулись ли они тогда с помощьюhistory.back()
[]
в NodeList нет смысла, и вы не можете назначить строку для обработчика событий.Проверьте,
window.history.length
равен ли он 0.источник