Манипулирование window.history влияет на favicon на IE11

Вот сценарий: на сайте уже есть кэшированный фавикон (/favicon.ico файл) и я хочу это изменить. Этого легко достичь (добавив строку запроса к пути favicon: favicon.ico?v2). Но, любое изменение состояния (вызывая window.history.pushState() или же window.history.replaceState()) меняет значок на старый.

Похоже, IE11 принимает favicon.ico из каталога BASE, который, к сожалению, кешируется (favicon.ico?v2 рассматривается как другая сущность в кэше IE11).

Стоит отметить, что проблема не возникает при манипулировании location.hash, Так что меняем состояние с:

http://x.com

чтобы:

http://x.com/#id=5

не влияет на значок. Но меняем состояние на:

http://x.com/?id=5

переключает значок на старый (если он кешируется) или по умолчанию с IE11. Как только я обновлю браузер, появится новый значок.

Об этом уже сообщалось как об ошибке в IE11, но Microsoft решила оставить это. Я нашел два связанных вопроса: использование history.pushState в Firefox заставляет мой значок исчезнуть, а history.pushState в Chrome делает запрос значка, но ни один из них не дает решения моей проблемы.

Я также пытался обновить ссылку на значок избранного после изменения состояния (путем обновления link href атрибут) - это помогло на Edge, но не на IE11. браузер на самом деле отправляет новый запрос favicon, но он все еще показывает старый.

Я ищу способ сохранить значок после изменения состояния. Альтернативным решением может быть программное принудительное обновление IE11 favicon.ico файл (предположим, что Expires заголовок не был установлен).

1 ответ

Есть решение, но оно довольно хакерское.

Проблема в том, что IE кэширует значки по отдельности, и они будут загружены, только если вся страница есть. PushState просто проверяет существующий кеш и отображает только избранные страницы, которые были загружены ранее. Если pushState не использовался, вы можете изменить значок с помощью JavaScript, а потом не сможете.

Однако кеш фавиконов обновляется в реальном времени, поэтому вы можете сделать следующее:

  • Установите скрытый iframe на своей странице.
  • Перед вызовом pushState загрузите нужную страницу с дополнительным хешем (например, #onlyFavicon) в iframe (обязательно используйте замену, иначе ifarem повлияет на вашу историю).
  • Пусть ваш сервер - или javaScript - проверит ваш хэш при загрузке страницы и предоставит пустую страницу с помощью только значка.
  • После загрузки iframe ваш кеш избранного обновляется новым значком (добавьте в iframe список событий onLoad, чтобы знать, когда) Нет необходимости ждать, значок обновляется автоматически после загрузки iframe.
  • Если вы позвоните pushState сейчас, значок будет отображаться правильно

Я знаю, что это глупо и поздно, но я надеюсь, что это поможет любому, кто также наткнется на эту проблему.

Другие вопросы по тегам