2014-11-27 2 views
0

У меня есть веб-страница с формой на ней; Я хочу предупредить пользователя, если они уйдут. Я не выполнил грязный проверка поэтому мой onbeforeunload код простоsetTimeout (x, 0) не задерживается в Chrome

window.onbeforeunload = function() { 
    return 'message' 
}; 

Я не хочу это предупреждение, когда они представить форму, поэтому я удалить событие на кнопку. Тем не менее, подача может сбой, поэтому мне нужно вернуть событие после этого (так что если они , то отходят, они все равно предупреждаются). С этой целью я сделал следующее:

var tempDisableBeforeUnload = function() { 
    var obu = window.onbeforeunload; 
    if (obu) { 
     window.onbeforeunload = null; 
     setTimeout(function() { 
      window.onbeforeunload = obu; 
     }, 0); 
    } 
} 
$("form.noWarnOnSubmit").submit(tempDisableBeforeUnload); 

Это отлично работает в Firefox и IE - setTimeout(x, 0) не задерживает восстановление обработчика событий до после submit решил, является ли он успешным или нет.

Однако в Chrome время ожидания появляется немедленно, и я получаю предупреждение при отправке формы.

Как я могу сделать эту работу в Chrome, или как еще я могу достичь конца «не предупреждать о отправке, но оставьте предупреждение, если сбой подачи»?

+0

Можете ли вы определить, что вы имеете в виду отправке был ли успешным? Вы имеете в виду потенциально другие обработчики событий, вызывающие 'preventDefault' и т. Д.? –

+0

Он работает в Chrome: http://jsbin.com/bavayuwohu/3/edit. По крайней мере, для меня (v39). –

+0

@JamesThorpe Да, у меня есть ненавязчивая проверка работоспособности, и это потенциально отменяет отправку. – Rawling

ответ

1

Cant сделать следующее:

var unloadActive = true; 
window.onbeforeunload = function() { 
    if(unloadActive) return 'message' 
}; 
$("form.noWarnOnSubmit").submit(function(event){ 
    unloadActive = false; 
    // do all your checks and things, whatever, and if the checks fail: 
    unloadActive = true; 
}); 

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

+0

К сожалению, все мои чеки и вещи привязаны к событию отправки уже по другому коду ... но вы правы, я мог бы развязать их и называть их вручную в моем собственном обработчике отправки.Но тогда я должен убедиться, что моя привязка называется * после * всех других привязок, поэтому я могу убедиться, что я их всех получаю ... – Rawling

0

Я преодолел мою немедленную проблему путем

  • Binding моего события Стреляет постфактум валидацию Jquery, отсрочив мое submit событие переплета
$(function() { 
    $("form.noWarnOnSubmit").submit(disableBeforeUnloadIfNotCancelled); 
}); 
  • меняет обработчик события, чтобы отменить событие onbeforeunload, если событие submit i s отменено.
var disableBeforeUnloadIfNotCancelled = function (e) { 
    if (!e.isDefaultPrevented()) { 
     window.onbeforeunload = null; 
    } 
} 
+0

Мне не нравится это решение, потому что оно зависит от порядка загрузки скриптов, поэтому я «Я собираюсь оставить этот вопрос открытым для других решений. – Rawling

Смежные вопросы