setTimeout(x,0)不会在Chrome中延迟

时间:2014-11-27 17:05:45

标签: javascript google-chrome

我有一个带有表格的网页;如果他们离开,我想警告用户。我没有实现脏检查,所以我的onbeforeunload代码只是

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上完成这项工作,或者我怎样才能达到“不提交时发出警告,但如果提交失败则将警告恢复”的结束?

2 个答案:

答案 0 :(得分:1)

你能做到以下几点:

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;
});

然后你不需要做所有可能导致问题的杂耍功能。我还没有测试过这个,但这就是我要做的。

答案 1 :(得分:0)

我已经克服了我的直接问题

  • 通过推迟我的submit事件绑定,将我的事件绑定到jQuery验证事件后触发:
$(function() {
    $("form.noWarnOnSubmit").submit(disableBeforeUnloadIfNotCancelled);
});
  • 如果onbeforeunload事件被取消,请将我的事件处理程序更改为仅取消绑定submit事件。
var disableBeforeUnloadIfNotCancelled = function (e) {
    if (!e.isDefaultPrevented()) {
        window.onbeforeunload = null;
    }
}