Как я могу проверить, изменился ли URL в JavaScript? Например, веб-сайты, такие как GitHub, которые используют AJAX, будут добавлять информацию о странице после символа #, чтобы создать уникальный URL-адрес без перезагрузки страницы. Как лучше всего определить, изменяется ли этот URL?
- Является ли
onload
называется событие еще раз? - Есть ли обработчик событий для URL?
- Или URL должен проверяться каждую секунду, чтобы обнаружить изменение?
javascript
ajax
AJ00200
источник
источник
Ответы:
В современных браузерах (IE8 +, FF3.6 +, Chrome) вы можете просто прослушать
hashchange
событиеwindow
.В некоторых старых браузерах вам нужен таймер, который постоянно проверяет
location.hash
. Если вы используете jQuery, есть плагин, который делает именно это.источник
beforeunload
событие. Если ваш код инициировал изменение URL, он знает лучше.Я хотел иметь возможность добавлять
locationchange
слушателей событий. После изменения ниже мы сможем сделать это, как этоНапротив,
window.addEventListener('hashchange',()=>{})
будет срабатывать только в том случае, если часть после хэштега в URL-адресе изменяется иwindow.addEventListener('popstate',()=>{})
не всегда работает.Эта модификация, аналогичная ответу Кристиана , изменяет объект истории, чтобы добавить некоторую функциональность.
По умолчанию есть
popstate
событие, но нет событий дляpushstate
иreplacestate
.Это изменяет эти три функции, так что все они запускают пользовательское
locationchange
событие для вас, а такжеpushstate
иreplacestate
события, если вы хотите их использовать:источник
используйте этот код
с помощью jQuery
источник
РЕДАКТИРОВАТЬ после небольшого исследования:
Почему-то кажется, что меня одурачила документация, представленная в документации по Mozilla.
popstate
Событие (и его функции обратного вызоваonpopstate
) являются не срабатывает всякий раз , когдаpushState()
илиreplaceState()
вызываются в коде. Поэтому оригинальный ответ не применяется во всех случаях.Однако есть способ обойти это, исправляя функции в соответствии с @ alpha123 :
Оригинальный ответ
Учитывая, что заголовок этого вопроса - « Как обнаружить изменение URL », ответ, когда вы хотите знать, когда меняется полный путь (а не только хэш-привязка), заключается в том, что вы можете прослушивать
popstate
событие:Ссылка для popstate в Mozilla Docs
В настоящее время (январь 2017 г.) поддержка popstate поддерживается 92% браузеров по всему миру.
источник
С JQuery (и плагин) вы можете сделать
http://benalman.com/projects/jquery-hashchange-plugin/
В противном случае да, вам придется использовать setInterval и проверить наличие изменений в хеш-событии (window.location.hash)
Обновить! Простой проект
источник
window.addEventListener("hashchange", hashChanged);
detect()
функции?Добавьте слушателя события изменения хэша!
Или, чтобы прослушать все изменения URL:
Это лучше, чем приведенный ниже код, потому что в window.onhashchange может существовать только одна вещь, и вы, возможно, будете перезаписывать чужой код.
источник
это решение работало для меня:
источник
setInterval
наsetTimeout
: «использование setInterval () через некоторое время остановит браузер, потому что он будет создавать новый вызов checkURLchange () каждую секунду. setTimeout () правильное решение, потому что оно вызывается только один раз ".setTimeout
как подсказывает @divibisan, переместитеsetInterval
внешнюю часть функции.checkURLchange();
также становится необязательным.Хотя старый вопрос, проект Location-bar очень полезен.
источник
Чтобы прослушать изменения URL, см. Ниже:
Используйте этот стиль, если вы собираетесь остановить / удалить слушателя после определенного условия.
источник
Делая небольшое расширение Chrome, я столкнулся с той же проблемой с дополнительной проблемой: иногда меняются страницы, но не URL-адреса.
Например, просто перейдите на домашнюю страницу Facebook и нажмите кнопку «Домой». Вы перезагрузите страницу, но URL не изменится (стиль одностраничного приложения).
В 99% случаев мы занимаемся разработкой веб-сайтов, чтобы мы могли получать такие события от таких структур, как Angular, React, Vue и т. Д.
НО , в моем случае с расширением Chrome (в Vanilla JS) мне приходилось прослушивать событие, которое будет срабатывать при каждом «изменении страницы», которое обычно можно отследить по измененному URL-адресу, но иногда это не так.
Моим домашним решением было следующее:
Таким образом, в основном решение leoneckert, примененное к истории окон, будет меняться при изменении страницы в одностраничном приложении.
Не ракетостроение, а самое чистое решение, которое я нашел, учитывая, что мы здесь проверяем только целочисленное равенство, а не большие объекты или весь DOM.
источник
window.history
имеет максимальную длину 50 (по крайней мере, для Chrome 80). После этой точкиwindow.history.length
всегда возвращается 50. Когда это произойдет, этот метод не сможет распознать любые изменения.Посмотрите на функцию выгрузки jQuery. Он обрабатывает все вещи.
https://api.jquery.com/unload/
источник
источник
Ниже приводится ответ (со старым синтаксисом JavaScript (без функции стрелки, поддержка IE 10+)): https://stackoverflow.com/a/52809105/9168962
источник
Еще один простой способ сделать это - добавить событие click через имя класса к тегам привязки на странице, чтобы определить, когда на него щелкнули, затем вы можете использовать window.location.href, чтобы получить данные URL, которые Вы можете использовать для запуска вашего запроса AJAX на сервер. Просто и легко.
источник
Вы начинаете новый
setInterval
при каждом вызове, не отменяя предыдущий - вероятно, вы только хотели иметьsetTimeout
источник