IE не запускает popstate, когда hashchange происходит

У меня есть страница, которая выполняет маршрутизацию на клиентах, используя 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

...???:/

Ответ 2

Это известная проблема в IE11 и обозревателях Internet Explorer до Edge.

Смотрите эту ссылку https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3740423/. Ответ Microsoft является последним сообщением в этом выпуске отчета и отмечает новейшую версию, которая работает.

Все версии IE будут отображать это поведение, а хакерство/обезьяна-исправление правильного поведения обратно в структуру событий - это, пожалуй, единственный способ заставить его работать надежно. Это означает, что вам, скорее всего, потребуется конкретная логика IE, если вы хотите реализовать ее самостоятельно.

Ответ 3

В IE 10 и 11 событие popstate будет запущено только для элемента истории после того, как состояние было установлено с помощью history.pushState или replaceState, в том числе, когда оно установлено в null, и только при обходе между двумя элементами, которые имели состояние. Поэтому необходимо установить состояние для нового элемента истории в событии hashchange. Как только состояние будет установлено, событие popstate будет срабатывать, когда пользователь перейдет через историю браузера.

https://developer.mozilla.org/en-US/docs/Web/API/History