Подтвердить что ты не робот

Firefox запускает события обмена после восстановления вкладки

Firefox запускает события обмена в моем webapp после восстановления вкладки.

При повторной загрузке одного и того же URL-адреса в Firefox нет никаких проблем, при загрузке страницы не активируются события обмена, все измененные значения после последнего посещения отображаются правильно.

Но при повторной открытии одной и той же страницы с тем же URL-адресом, после закрытия Firefox и повторного открытия страницы с помощью "восстановленных вкладок" (из опции Firefox "показывать мои окна и вкладки с последнего времени" ), тогда он запускает события обмена для всех значения, которые были изменены с момента последнего посещения.

Фактический рабочий процесс для воспроизведения проблемы:

  • Мои события обновления находятся в фоновом режиме (JavaScript/AJAX) и увольняются с событиями onchange;
  • В настройках Firefox "показывать мои окна и вкладки с последнего времени" включен;
  • Измените некоторые значения на моей странице (выберите поля);
  • Закрыть Firefox;
  • Откройте тот же URL-адрес другого браузера или компьютера и измените некоторые значения;
  • Повторно запустите Firefox, выберите вкладку со страницей на ней, она перезагружает и снова запускает события обмена для всех измененных значений с момента последнего посещения.

Попробовал воспроизвести это поведение с совершенно разными страницами (не созданными мной и с использованием других script библиотек и т.д.), и результат тот же, он всегда запускает события onchange.

Chrome не делает этого с опцией "вкладки восстановления".

Почему он запускает события onchange? Как я могу предотвратить это?

4b9b3361

Ответ 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)
     }

 }

http://fiddle.jshell.net/nozp9uhk/6/show/

Ответ 2

Firefox загружает ваши файлы при загрузке страницы, поэтому при восстановлении вкладки различия между вашими кешированными значениями и новыми могут запускаться в событиях обмена.

Попробуйте очистить кеш при восстановлении вкладки. Я вижу два способа сделать это:

Вызов window.location.reload(true) для перезагрузки текущей страницы

или

Измените имя файла JavaScript, который инициализирует события onchange для этого:

<script language="JavaScript" type="text/javascript" src="yourscript.js?n=1"></script>

Это (? n = 1) заставит Firefox загружать новую копию файла "yourscript.js"