Как вы определите, действительно ли пользователь нажал кнопку «Назад» в браузере?
Как вы применяете использование кнопки возврата внутри страницы внутри одностраничного веб-приложения, использующего #URL
систему?
Почему же кнопки браузера не запускают свои собственные события !?
Ответы:
(Примечание: в соответствии с отзывами Шарки я включил код для обнаружения возврата)
Итак, я часто сталкивался с этими вопросами в SO, и недавно столкнулся с проблемой управления функциональностью кнопки возврата самостоятельно. После нескольких дней поиска лучшего решения для моего приложения (одностраничный с хэш-навигацией) я нашел простую, кросс-браузерную, безбиблиотечную систему для обнаружения кнопки «назад».
Большинство людей рекомендуют использовать:
Однако эта функция также будет вызываться, когда пользователь использует элемент на странице, который изменяет хэш расположения. Не лучший пользовательский опыт, когда ваш пользователь нажимает и страница перемещается назад или вперед.
Чтобы дать вам общее представление о моей системе, я заполняю массив предыдущими хэшами, когда мой пользователь перемещается по интерфейсу. Это выглядит примерно так:
Довольно прямо вперед. Я делаю это для обеспечения кросс-браузерной поддержки, а также поддержки старых браузеров. Просто передайте новый хеш функции, и он сохранит его для вас, а затем изменит хеш (который затем заносится в историю браузера).
Я также использую кнопку возврата на странице, которая перемещает пользователя между страницами с помощью
lasthash
массива. Это выглядит так:Так что это переместит пользователя обратно к последнему хешу и удалит этот последний хеш из массива (у меня сейчас нет кнопки вперед).
Так. Как определить, использовал ли пользователь мою кнопку возврата на странице или кнопку браузера?
Сначала я посмотрел
window.onbeforeunload
, но безрезультатно - это вызывается, только если пользователь собирается менять страницы. Этого не происходит в одностраничном приложении, использующем хеш-навигацию.Итак, после еще нескольких копаний я увидел рекомендации по установке переменной-флага. Проблема с этим в моем случае заключается в том, что я попытался бы установить его, но, поскольку все является асинхронным, он не всегда будет установлен вовремя для оператора if в изменении хеша.
.onMouseDown
не всегда вызывался в клике, и добавление его в onclick никогда не вызывало бы его достаточно быстро.Это когда я начал смотреть на разницу между
document
, иwindow
. Мое окончательное решение состояло в том, чтобы установить флаг, используяdocument.onmouseover
, и отключить его, используяdocument.onmouseleave
.Что происходит, когда мышь пользователя находится внутри области документа (читай: отображаемая страница, но исключая фрейм браузера), мой логический параметр установлен на
true
. Как только мышь покидает область документа, логическое значение переходит наfalse
.Таким образом, я могу изменить свой
window.onhashchange
на:Вы отметите чек на
#undefined
. Это потому, что если в моем массиве нет доступной истории, он возвращаетсяundefined
. Я использую это, чтобы спросить пользователя, хотят ли они уйти, используяwindow.onbeforeunload
событие.Итак, вкратце, и для людей, которые не обязательно используют кнопку возврата на странице или массив для хранения истории:
И там у вас есть это. простой, состоящий из трех частей способ обнаружения использования кнопки «Назад» и элементов на странице в отношении хеш-навигации.
РЕДАКТИРОВАТЬ:
Чтобы убедиться, что пользователь не использует backspace для запуска события back, вы также можете добавить следующее (спасибо @thetoolman по этому вопросу ):
источник
Вы можете попробовать
popstate
обработчик событий, например:Примечание. Для достижения наилучших результатов этот код следует загружать только на определенных страницах, где требуется реализовать логику, чтобы избежать любых других непредвиденных проблем.
Событие popstate запускается каждый раз, когда изменяется текущая запись истории (пользователь переходит в новое состояние). Это происходит , когда пользователь нажимает на кнопки Back / Forward браузера или когда
history.back()
,history.forward()
,history.go()
методы программно называется.event.state
is события равно объекту состояния истории.Для синтаксиса jQuery оберните его (чтобы добавить даже слушателя после того, как документ будет готов):
Смотрите также: window.onpopstate при загрузке страницы
См. Также примеры на одностраничных приложениях и HTML5 pushState page:
Это должно быть совместимо с Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ и аналогичными.
источник
Я довольно долго боролся с этим требованием и использовал некоторые из приведенных выше решений для его реализации. Однако я наткнулся на наблюдение, и оно, похоже, работает в браузерах Chrome, Firefox и Safari + Android и iPhone.
На странице загрузки:
Позвольте мне знать, если это помогает. Если что-то упустил, я буду рад понять.
источник
event
имеет значение даже для кнопки впередВ javascript, тип навигации
2
означает, что браузер нажал кнопку «назад» или «вперед», и браузер фактически берет контент из кэша.источник
Это определенно будет работать (для обнаружения нажатия кнопки назад)
источник
Посмотри это:
работает нормально ...
источник
Это единственное решение, которое сработало для меня (это не одностраничный сайт). Работает с Chrome, Firefox и Safari.
источник
Правильный ответ уже есть, чтобы ответить на вопрос. Я хочу упомянуть новый JavaScript API PerformanceNavigationTiming , он заменяет устаревший performance.navigation .
Следующий код будет входить в консоль "back_forward", если пользователь зашел на вашу страницу с помощью кнопки назад или вперед. Посмотрите на таблицу совместимости, прежде чем использовать ее в своем проекте.
источник
Браузер: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Для мобильного управления: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
источник
Вот мой взгляд на это. Предполагается, что при изменении URL-адреса, но при отсутствии
document
обнаруженного клика , браузер возвращается (да или вперед). Клик пользователя сбрасывается через 2 секунды, чтобы это работало на страницах, которые загружают контент через Ajax:источник
Я смог использовать некоторые ответы в этой теме и другие, чтобы заставить его работать в IE и Chrome / Edge. history.pushState для меня не поддерживается в IE11.
источник
Полноценный компонент может быть реализован, только если вы переопределите API (измените методы объекта 'history'), я поделюсь только что написанным классом. Протестировано на Chrome и Mozilla. Поддерживает только HTML5 и ECMAScript5-6.
источник
Document.mouseover не работает для IE и FireFox. Однако я попробовал это:
Это работает для Chrome и IE, а не FireFox. Все еще работаю, чтобы получить право FireFox. Любой простой способ обнаружить нажатие кнопки «Назад / Вперед» в браузере приветствуется, не только в JQuery, но и в AngularJS или обычном Javascript.
источник
Приведенный выше код работал для меня. В мобильных браузерах, когда пользователь нажимал кнопку «Назад», мы хотели восстановить состояние страницы в соответствии с его предыдущим посещением.
источник
Я решил эту проблему, отслеживая исходное событие, которое вызвало
hashchange
(будь то удар, щелчок или колесо), чтобы событие не было ошибочно принято за простую посадку на странице, и используя дополнительный флаг в каждое из моих событий привязки. Браузер не установит флаг сноваfalse
при нажатии кнопки «Назад»:источник
Я попробовал вышеупомянутые варианты, но ни один из них не работает для меня. Вот решение
Обратитесь по этой ссылке http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli для получения более подробной информации
источник