Ответ 1
Попробуйте использовать polyfill для API истории для лучшей поддержки https://github.com/browserstate/history.js
У меня есть страница, которая выполняет маршрутизацию на клиентах, используя API истории и push/popstate. Это очень хорошо работает во всех современных браузерах. (поисковые системы будут поддерживаться node.js prerenderer)
Однако я недавно столкнулся с проблемой, когда IE не запускает popstate на hashchange, тогда как pushstate с URL-адресами работает нормально, включая IE11.
Например, так...
$(document).on('click', 'a', function(e) {
e.preventDefault();
History.pushState({}, '', $(this).attr('href'));
});
... который правильно срабатывает...
$(window).on('popstate', function() {
console.log('url changed');
});
Согласно спецификации W3C, hashchange должен срабатывать popstate при изменении текущей истории. Однако, когда я добавляю в хэш-ссылки (<a href="#hashchange">...
), нажав на IE, ничего не срабатывает.:/
Я бы не хотел, чтобы IE обнаруживал (поскольку в настоящее время существует так много браузеров, которые могут попасть в ту же самую яму гибели), а не с помощью обнаружения признаков. Однако, поскольку история (popstate/pushstate) работает просто отлично, остальная часть пути я даже не могу обнаружить проблему при отсутствии push/popstate...
if(!window.history || !window.history.pushState) { ...
... и вместо этого используйте hashchange.:/
Любые мысли?
PS. В качестве бонуса, используя jquery.history.js(jquery wrapped version of history.js) с хэштаг-url, ударит все это.
http://localhost/routetest/index.html#/page1/1234
становится
http://localhost/page1/1234
...???:/
Попробуйте использовать polyfill для API истории для лучшей поддержки https://github.com/browserstate/history.js
Это известная проблема в IE11 и обозревателях Internet Explorer до Edge.
Смотрите эту ссылку https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3740423/. Ответ Microsoft является последним сообщением в этом выпуске отчета и отмечает новейшую версию, которая работает.
Все версии IE будут отображать это поведение, а хакерство/обезьяна-исправление правильного поведения обратно в структуру событий - это, пожалуй, единственный способ заставить его работать надежно. Это означает, что вам, скорее всего, потребуется конкретная логика IE, если вы хотите реализовать ее самостоятельно.
В IE 10 и 11 событие popstate будет запущено только для элемента истории после того, как состояние было установлено с помощью history.pushState или replaceState, в том числе, когда оно установлено в null, и только при обходе между двумя элементами, которые имели состояние. Поэтому необходимо установить состояние для нового элемента истории в событии hashchange. Как только состояние будет установлено, событие popstate будет срабатывать, когда пользователь перейдет через историю браузера.