3

嗨,我想阻止 ctrl+s(save) 的默认行为,所以我尝试了以下代码

jQuery(document).bind("keydown", function(e) {
  if(e.ctrlKey && (e.which == 83)) {
    e.preventDefault();
    alert("Ctrl+S");
    return false;
  }
}); 

但这仅在 chrome 中而不是在 firefox 中阻止。在 firefox 中弹出保存对话框,为什么会发生这种情况,或者我错过了什么。有什么帮助吗?

4

2 回答 2

3

尝试这个....

$(document).bind("keydown", function(e) {
  if(e.ctrlKey && (e.which == 83)) {
    e.preventDefault();
    setTimeout(function() {
      alert("Ctrl+S");
    }, 1000);
    return false;
  }
});

使用警报将完成线程执行,只有在单击警报的确定按钮后才能再次拾取线程。我只能想象此时 'preventDefault' 尚未被 Firefox 确认(即使您在警报之前调用它)并且它继续显示“另存为”对话框。

我使用 setTimeout 将警报延迟 1 秒,尽管我确信使用 0 会产生相同的效果......只需将显示警报的函数(现在是异步)推到执行堆栈的后面,这将让浏览器完成preventDefault的执行。

我知道你不想要“警报”,但我想我会解释这种行为。

于 2013-10-03T10:18:04.163 回答
0

试试下面的代码:

$(document).ready(function(){
    $(document).bind('keydown', function(event) {
      //19 for Mac Command+S
     if (!( String.fromCharCode(event.which).toLowerCase() == 's' && event.ctrlKey) && !(event.which == 19)) return true;

      event.preventDefault();
      console.log("Ctrl-s pressed");
      return false;
   });
});

JS 小提琴:http: //jsfiddle.net/dpHk9/

解释

以下代码将 unicode 数字转换为相应的字符:

String.fromCharCode(number) //returns A for 65

下面的代码代表控制键:

event.ctrlKey

在 MAC 上,command+s返回 19

于 2013-10-03T09:54:42.833 回答