Ответ 1
Несколько предложений о том, как справиться с этим, в зависимости от желаемого результата. Обратите внимание, что это проверено на моей машине, поведение может отличаться.
Кажется, что они работают, так это то, что Firefox пытается восстановить данные, введенные пользователем. Поэтому он изменяет страницу, вызывая change
event
. Это событие отличается от того, которое запускается пользователем. Это UIEvent
, в то время как пользователь запускает один, это прямой event
. И это событие cancelable
и срабатывает перед событием window load
. Таким образом, это дает пару способов справиться с этим. Например, я возьму элемент select.
Если вы хотите сохранить значение, введенное до закрытия окна, но не запускать событие onchange, вы можете установить onchange-вызов на window.onload
. Вот так:
window.onload = function(){
element.onchange = function(){
Поскольку настройка select
встречается до onload
, это конкретное изменение не приведет к срабатыванию вашей функции onchange
.
Другим способом было бы настроить поведение, которое вы не вызываете, поместив условие, подтверждающее, что элемент отменен или нет. Если он cancelable
, это означает, что он вызван из сеанса восстановления и не будет запускать то, что внутри. Вот так:
element.onchange = function(e){
if(e.cancelable == true){
Другим способом, чтобы очистить все данные, было бы установить событие document.onchange
и перезагрузить страницу, если событие cancelable
. Вот так:
document.onchange = function(e){
if(e.cancelable == true){
window.location = window.location
}
}
Конечно, вам нужно убедиться, что на вашей странице нет другого события отмены транзакции.
EDIT:
Чтобы уточнить порядок срабатывания событий, см. этот jsfiddle, а не в iframe, iframe, похоже, ведет себя по-другому, поэтому, если у вас есть iframes, это может быть немного сложнее. Но без iframe вы увидите, как различные события запускаются в зависимости от ваших взаимодействий:
document.onchange = function (e) {
//this will be triggered on restore before the window load event
alert('restore onchange called, e.cancelable = ' + e.cancelable)
}
window.onload = function (e) {
//You'll see that on restore, this will be triggered but after page has been updated
alert('window load called')
document.onchange = function () {
//This onchange will be called normally, not on restore
alert('after onload change, e.cancelable = ' + e.cancelable)
}
}