В моем приложении Чтобы скрыть некоторую информацию в URL-адресе, я использую приведенный ниже код.
history.replaceState ({}, "", "bar.html");
Работает во всех браузерах кроме последней версии firefox (v56 +)
В Firefox, если я нажму F5, он вернется к предыдущему URL-адресу, который я уже заменил приведенным выше кодом.
Любая помощь будет принята с благодарностью.
В последней версии Firefox эта ошибка кажется исправленной. Попробуй!
о, блин, я надеялся на воспроизведение последней версии (я вижу это в кванте Firefox, то есть 66.0.3 64-бит). какая именно версия у вас сейчас как последний, кстати?
Что ж, я понимаю вашу проблему и затрудняюсь ответить :( Что я заметил в связи с этой проблемой, так это то, что она появляется в определенных версиях после 56. * Но я не уверен, в какой версии она будет исправлена. Я также правильно использую версию 66 сейчас.
Есть открытый выпуск на Bugzilla
.
Видео Пример 1 и Видео Пример 2 объясняют, как воспроизвести ошибку.
Conditions:
- Mozilla Firefox version only
56+
- Single Page Application
- For routing uses
history.replaceState
, all parameters not nullSteps:
- Login & redirect to main page base
URL
- Navigate on any application tab & replace URL parameters
- Press
F5
,cmd + r
or clickRefresh
button- Ups!.. Again open main page with base
URL
(but in other browsers we see the selected tab and the correct URL)
Такое же поведение наблюдается при удалении строк запроса из URL-адреса.
Это могло быть вызвано следующим поведением (цитирую Вадим Гончаров)
The main problem is that after using
history.replaceState
and then clickingcmd+r/f5
we will see that browser sends replaced (correct)url
to server, but shows incorrect url both inlocation.search
and browser url bar. And this behaviour continues (if click to "cmd+r/f5") until we click "enter" on browser url bar.
Первый Обходной путь отправлен из Феликс Ли
Before calling
history.replaceState
, dolocation.hash = location.hash;
Setting
hash
to itself has no effect, but makes the bug go away.
Этот обходной путь не идеален, и Мтомаллея добавляет второй обходной путь
The browser is requesting a different URL than what is shown in the location bar....
Additionally, the workaround isn't ideal because if the
URL
doesn't already have ahash
,location.hash = location.hash
adds one, callspopstate
, and adds a history entry.An alternate workaround that is much less simple:
- Use whatever means available to your backend technology to expose the request
URI
on the client- On page load (before any client routing code), check the
URI
againstwindow.location
- If they're different, use
replaceState
to fix it.The location will briefly show the incorrect URL on any reload, but at least it'll be fixed and routing can work as expected...
Третье решение предложено из Матис Виль
window.addEventListener('unload', function(event) { location.replace(location) });
This way the state of the js location is flushed to FFs location in cases of refreshes and tab closes (which by the way have the same issue when reopened with e.g. ⌘+⇧+t).
Вышеупомянутый обходной путь от Матис имеет следующую проблему (я цитирую Джиммихмиллер)
Next.js tried using the workaround that Mathis mentioned above and it caused some bad issues for them. Details here: https://github.com/zeit/next.js/pull/6896
Возникла новая ошибка с указанным выше обходной путь, объясненная в проблеме # 6882
when landing on a page that contains query parameters, the browser becomes "locked" to that page and programmatically or manually navigating to a different same-domain page insta-redirects back to the original. note that this does not start happening until a query parameter is involved in the url, totally bizarre
Я также включаю список другие связанные с Mozilla проблемы с history.replaceState.
Я остаюсь доступным для дальнейшего анализа, исследования и улучшения этих сообщений, и я рад получить ваши отзывы.
@Eliran Malka есть открытый выпуск в Bugzilla
. Я включил решения в свой ответ. Я счастлив переписать ответ, расширить свой поиск и внести улучшения.
@EliranMalka, с удовольствием! :-) Спасибо
@EliranMalka спасибо за награду, пожалуйста, свяжитесь со мной для получения дополнительной помощи
вы узнали что-нибудь по этому поводу? я боролся с ошибкой с похожими симптомами