10

我试图为基于浏览器的应用程序实现CTRL+S功能。我进行了搜索,并在以下问题中遇到了两个脚本

使用 JQuery 捕获 CTRL+S 的最佳跨浏览器方法?
Ctrl+S 防止 Chrome 中的默认设置

但是,当我尝试实现它时,它起作用了,但是我仍然得到默认的浏览器保存对话框/窗口

我的代码:对于shortcut.js

 shortcut.add("Ctrl+S",function() {
     alert("Hi there!");
 },
 {
     'type':'keydown',
     'propagate':false,
     'target':document
});

jQuery 热键.js:

$(document).bind('keydown', 'ctrl+s', function(e) {
    e.preventDefault();
    alert('Ctrl+S');
    return false;
});

我相信e.preventDefault();应该做的伎俩,但由于某种原因它不起作用。我哪里错了。对不起,如果它很简单,还在学习jJvascript。

4

5 回答 5

21

您不需要任何这些库,只需尝试以下操作:

$(document).on('keydown', function(e){
    if(e.ctrlKey && e.which === 83){ // Check for the Ctrl key being pressed, and if the key = [S] (83)
        console.log('Ctrl+S!');
        e.preventDefault();
        return false;
    }
});

问题是您的代码在 停止alert(),阻止您的函数中断保存对话。

(仍然使用 jQuery)

于 2013-01-28T12:32:46.323 回答
17

这只是为我使用的问题添加不同的实现。 改编自 SO answer.Also,适用于 MAC

 document.addEventListener("keydown", function(e) {
      if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey))      {
        e.preventDefault();
        //your implementation or function calls
      }
    }, false);
于 2013-01-28T13:15:25.100 回答
4

人们似乎仍在查看此内容,因此可能值得指出的是,此处不需要 jQuery:

function keydown (event) {
    var isCtrlKeyDown = navigator.platform.indexOf("Mac") > -1 ? event.metaKey : event.ctrlKey,
        isSDown = (event.key && event.key === "s") || (event.keyCode || event.which) === 83 // falls back to keycode if no event.key

    if (isCtrlKeyDown && isSDown) {
        // prevent default event on newer browsers
        if (event.preventDefault) {
            event.preventDefault()
        }


        // ... your code here ...


        // prevent default event on older browsers
        return false
    }
}

// register the event
if (document.addEventListener) {
    document.addEventListener("keydown", keydown)
} else {
    document.onkeydown = keydown
}

这应该适用于所有浏览器,这也适用于在 Windows 上使用 QWERTY 的替代键盘布局的人,它报告不正确的键代码(至少在我的测试中 Windows 10 上的 Chrome 56 上)

但是,这看起来有点笨拙且令人困惑,因此如果您只支持现代浏览器,则可以执行以下操作:

document.addEventListener("keydown", function keydown (event) {
    if (navigator.platform === "MacIntel" ? event.metaKey : event.ctrlKey && event.key === "s") {
        event.preventDefault()

        // ... your code here ...
    }
})
于 2017-06-05T22:51:15.653 回答
2

从 2017 年开始,e.keyCode === 83您应该使用,而不是使用e.key === 's',因为前者已被弃用。

于 2017-12-01T14:33:34.307 回答
1

无需使用任何插件,只需使用下面的jquery代码

$(document).bind('keydown', 'ctrl+s', function (e) {
        if (e.ctrlKey && (e.which == 83)) {

            e.preventDefault();
            //Your method()
            return false;
        }
    });

由于您正在使用警报,因此执行会在警报处停止,并且在您关闭警报框之前不会执行“return false”,这就是您看到默认对话框的原因。

如果您的方法运行时间较长,则最好使用 asyn 方法方法。

于 2013-01-28T12:34:44.243 回答