为什么这段代码不能捕获/阻止jquery / javascript中的CTRL + S工作?

时间:2016-10-05 13:40:52

标签: javascript jquery key-bindings

我很长时间都在努力让我的代码工作,并在StackOverflow上尝试了各种各样的答案,这些答案都采用了相同的形式。最后,我决定这个:

$(window).bind('keydown',function(e) {
    if ((e.which=='115' || e.which=='83') && (e.ctrlKey || e.metaKey)){
        e.preventDefault();
        saveForm(); // Uses AJAX to save all the data in my form 
        return false;
    }
}

问题在于,无论我尝试了什么,只要绑定到窗口,文档,keydown,按键的组合,没有任何工作,无论如何都会出现保存对话。

1 个答案:

答案 0 :(得分:1)

因为我在页面卸载时使用saveForm()函数来确保在导航之前保存数据,所以我必须将ajax函数设置为异步。这意味着在保存和到达return false语句之间存在争用条件,当我评论saveForm()调用时,似乎是有效的(我不知道为什么{{1}并没有阻止它,但它没有。)

为了解决竞争条件,我考虑设置一个变量来选择何时同步或异步进行保存,但我意识到我可以通过延迟保存直到我完全取消 CTRL <之后完全避免竞争条件/ kbd> + S 组合键。以下是我的代码的最终版本:

preventDefault

这样,$(window).bind('keydown',function(e) { if ((e.which=='115' || e.which=='83') && (e.ctrlKey || e.metaKey)){ e.preventDefault(); setTimeout(function(){saveForm();},200); return false; } } preventDefault都会立即执行,我的保存会在几毫秒后弹出。