使用 JQuery 捕获 CTRL+S 的最佳跨浏览器方法?

IT技术 javascript jquery
2021-01-29 16:04:36

我的用户希望能够点击Ctrl+S来保存表单。是否有一种很好的跨浏览器方式来捕获Ctrl+S键组合并提交我的表单?

应用程序是基于 Drupal 构建的,因此可以使用 jQuery。

6个回答

这对我有用(使用 jquery)来重载Ctrl+ SCtrl+FCtrl+ G

$(window).bind('keydown', function(event) {
    if (event.ctrlKey || event.metaKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
        case 's':
            event.preventDefault();
            alert('ctrl-s');
            break;
        case 'f':
            event.preventDefault();
            alert('ctrl-f');
            break;
        case 'g':
            event.preventDefault();
            alert('ctrl-g');
            break;
        }
    }
});
这是我测试过的所有浏览器中唯一对我有用的答案,包括 Chrome 版本 28.0.1500.71
2021-03-16 16:04:36
@Fireflight: anelse if将不起作用,因为原始if语句已被评估为真。您必须将代码放在原始if语句之前,将原始语句转为else if.
2021-03-18 16:04:36
@NatesS 如果您删除警报,它不会打开保存对话框。它是由于警报引起的。在所有浏览器中对我来说都很好。不错的解决方法。
2021-03-22 16:04:36
如果你使用window.addEventListener(而不是纯 JS 是可行$(window).bind(
2021-03-31 16:04:36
为我工作。请接受这个答案而不是上面的答案。
2021-04-03 16:04:36
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
});

不同浏览器的密钥代码可能不同,因此您可能需要检查的不仅仅是 115。

在 OS X webkit 浏览器上,cmd+s 返回 19,因此也值得检查一下。即如果 (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) 返回真;
2021-03-13 16:04:36
使用keydown而不是keypress在 chrome 中
2021-03-16 16:04:36
仅适用于我的 Firefox。IE9 和 Chrome 不注册任何按键。
2021-03-31 16:04:36
即使使用 $(document).keypress(而不是 $(window).keypress),IE 和 Chrome 仍然会在脚本执行之前使用 'Ctrl' 获取按键事件。
2021-04-05 16:04:36
不幸的是它已经过时了
2021-04-10 16:04:36

您可以使用快捷方式库来处理浏览器特定的内容。

shortcut.add("Ctrl+S",function() {
    alert("Hi there!");
});
这个已经转为jQuery插件,分叉再分叉,现在支持1.6.x:github.com/ricardovaleriano/jquery.hotkeys
2021-03-26 16:04:36
对于 Google 同事,jQuery 插件的更新 URL 是:github.com/jeresig/jquery.hotkeys
2021-03-31 16:04:36

这个 jQuery 解决方案适用于我在 Chrome 和 Firefox 中的Ctrl+SCmd+ S

$(document).keydown(function(e) {

    var key = undefined;
    var possible = [ e.key, e.keyIdentifier, e.keyCode, e.which ];

    while (key === undefined && possible.length > 0)
    {
        key = possible.pop();
    }

    if (key && (key == '115' || key == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 
这现在可能已经过时了:使用e.key代替e.which
2021-03-18 16:04:36
这是唯一在这里正常工作的解决方案。非常感谢!
2021-03-22 16:04:36
2017 年 5 月 14 日更新现代标准。
2021-04-04 16:04:36

这个在 Chrome 上对event.which我有用......出于某种原因,我为我返回了一个大写的 S(83),不知道为什么(不管大写锁定状态)所以我使用fromCharCode并且toLowerCase只是为了安全起见

$(document).keydown(function(event) {

    //19 for Mac Command+S
    if (!( String.fromCharCode(event.which).toLowerCase() == 's' && event.ctrlKey) && !(event.which == 19)) return true;

    alert("Ctrl-s pressed");

    event.preventDefault();
    return false;
});

如果有人知道为什么我得到83而不是115,我会很高兴听到,如果有人在其他浏览器上测试这个,我会很高兴听到它是否有效

ps 现在我看了它,我认为 preventDefault 是多余的,因为 return false 触发了它(和 stopPropagation)但不确定它对问题很重要
2021-04-02 16:04:36
我对 chrome 也有同样的问题。好痛啊!
2021-04-07 16:04:36