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

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

Best cross-browser method to capture CTRL+S with JQuery?

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$(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;
        }
    }
});

1
2
3
4
5
6
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
});

各个浏览器的键码可能不同,因此您可能需要检查的字符不止115个。


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

1
2
3
shortcut.add("Ctrl+S",function() {
    alert("Hi there!");
});

此jQuery解决方案在Ctrl + SCmd + S中都适用于Chrome和Firefox。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$(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;
});

这个人在Chrome上为我工作...
出于某些原因,event.which为我返回了大写字母S(83),不确定为什么(不管大写锁定状态如何),所以我为了安全起见使用了fromCharCodetoLowerCase

1
2
3
4
5
6
7
8
9
10
$(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,我会很高兴听到,而且如果有人在其他浏览器上对此进行测试,我也会很高兴听到它是否有效


我结合了一些选项来支持FireFox,IE和Chrome。我也更新了它以更好地支持mac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// simply disables save event for chrome
$(window).keypress(function (event) {
    if (!(event.which == 115 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) && !(event.which == 19)) return true;
    event.preventDefault();
    return false;
});

// used to process the cmd+s and ctrl+s events
$(document).keydown(function (event) {
     if (event.which == 83 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) {
        event.preventDefault();
        save(event);
        return false;
     }
});

1
2
3
4
5
6
7
8
9
$(document).keydown(function(e) {
    if ((e.key == 's' || e.key == 'S' ) && (e.ctrlKey || e.metaKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
});
1
2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
Try pressing ctrl+s somewhere.

这是@AlanBellows答案的最新版本,将which替换为key。即使Chrome浏览器的大写键出现故障,它也可以使用(如果您按Ctrl + S,它将发送大写S而不是s)。在所有现代浏览器中均可使用。


老实说,我希望Web应用程序不要覆盖我的默认快捷键。 Ctrl + S已经在浏览器中执行了某些操作。根据我正在查看的网站突然进行更改会造成破坏性的影响,更不用说经常出现故障了。我有网站劫持了Ctrl + Tab,因为它看起来与Ctrl + I相同,既破坏了我在网站上的工作,又阻止了我像往常一样切换选项卡。

如果需要快捷键,请使用accesskey属性。请不要破坏现有的浏览器功能。


@Eevee:随着浏览器成为越来越丰富的功能的家并开始取代台式机应用程序,它不再是放弃使用键盘快捷键的选择。 Gmail丰富而直观的键盘命令集有助于我放弃Outlook。 Todoist,Google Reader和Google Calendar中的键盘快捷键每天都使我的生活变得越来越轻松。

开发人员绝对应该注意不要覆盖已经在浏览器中具有含义的按键。例如,我输入的WMD文本框莫名其妙地将Ctrl + Del解释为" Blockquote",而不是"向前删除单词"。我很好奇网站开发人员可以使用"浏览器安全"快捷方式的标准列表,并且浏览器将致力于在将来的版本中不使用。


这是我的解决方案,比这里的其他建议更容易阅读,可以轻松包含其他按键组合,并且已经在IE,Chrome和Firefox上进行了测试:

1
2
3
4
5
6
7
8
9
10
$(window).keydown(function(evt) {
    var key = String.fromCharCode(evt.keyCode);
    //ctrl+s
    if (key.toLowerCase() ==="s" && evt.ctrlKey) {
        fnToRun();
        evt.preventDefault(true);
        return false;
    }
    return true;
});

我喜欢这个小插件。但是,它需要更多的跨浏览器友好性。


我使用alert("With a message")防止默认行为解决了IE上的问题:

1
2
3
4
5
6
7
8
9
window.addEventListener("keydown", function (e) {
    if(e.ctrlKey || e.metaKey){
        e.preventDefault(); //Good browsers
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { //hack for ie
            alert("Please, use the print button located on the top bar");
            return;
        }
    }
});

给Alan Bellows回答:!(e.altKey)添加了用于在键入时使用AltGr的用户(例如,波兰)。如果不按此键,AltGr + S将产生与Ctrl + S相同的结果。

1
2
3
4
5
6
7
8
$(document).keydown(function(e) {
if ((e.which == '115' || e.which == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
{
    e.preventDefault();
    alert("Ctrl-s pressed");
    return false;
}
return true; });

例:

1
2
3
4
5
6
7
8
shortcut.add("Ctrl+c",function() {
    alert('Ok...');
}
,{
    'type':'keydown',
    'propagate':false,
    'target':document
});

用法

1
<script type="text/javascript" src="js/shortcut.js">

下载链接:http://www.openjs.com/scripts/events/keyboard_shortcuts/#


这个由我自己制作的插件可能会有所帮助。

插入

您可以使用此插件,您必须提供要运行的关键代码和功能,如下所示

1
2
3
simulatorControl([17,83], function(){
 console.log('You have pressed Ctrl+Z');
});

在代码中,我显示了如何执行Ctrl + S。您将在链接上获得详细文档。插件在我在Codepen上的笔的JavaScript代码部分中。


这应该可以工作(改编自https://stackoverflow.com/a/8285722/388902)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var ctrl_down = false;
var ctrl_key = 17;
var s_key = 83;

$(document).keydown(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = true;
}).keyup(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = false;
});

$(document).keydown(function(e) {
    if (ctrl_down && (e.keyCode == s_key)) {
        alert('Ctrl-s pressed');
        // Your code
        return false;
    }
});


推荐阅读

    linux命令删除用户组?

    linux命令删除用户组?,管理,密码,系统,用户组,用户,概念,命令,文件,管理员,

    linux提交程序命令行?

    linux提交程序命令行?,工作,系统,信息,地址,工程,目录,管理,环境,命令,功能,L

    linux中用户创建命令?

    linux中用户创建命令?,密码,系统,用户,软件,命令,联系方式,管理,信息,用户

    linux注销命令用户?

    linux注销命令用户?,系统,服务,密码,地址,工作,命令,状态,工具,信息,基础,lin

    linux命令行创建用户?

    linux命令行创建用户?,系统,密码,软件,新增,用户,联系方式,管理,用户名,命

    linux系统用户命令?

    linux系统用户命令?,系统,工作,地址,信息,管理,命令,目录,时间,电脑,名称,请

    linux命令所有用户?

    linux命令所有用户?,系统,密码,信息,情况,名称,命令,用户,时间,地址,位置,如

    linux命令进入用户?

    linux命令进入用户?,系统,密码,用户,地址,信息,软件,命令,用户名,联系方式,

    linux命令用户管理?

    linux命令用户管理?,系统,密码,管理,工作,信息,地址,工具,命令,用户,基础,LIn

    linux用户与组的命令?

    linux用户与组的命令?,管理,系统,名称,用户组,密码,用户,命令,情况,信息,单

    linux添加用户的命令?

    linux添加用户的命令?,密码,系统,软件,联系方式,用户,新增,信息,管理人员,

    linux用户退出的命令?

    linux用户退出的命令?,系统,密码,命令,用户,发行,电脑,第三,地址,软件,信息,l

    linux看系统用户命令?

    linux看系统用户命令?,系统,信息,密码,命令,服务,名称,网络,情况,软件,工具,L

    linux赋权用户命令?

    linux赋权用户命令?,系统,密码,用户,权限,地址,状态,数字,软件,管理,电脑,Lin

    linux组加用户命令?

    linux组加用户命令?,系统,密码,联系方式,用户,软件,管理,命令,用户名,用户

    linux命令中添加用户?

    linux命令中添加用户?,系统,密码,软件,用户,命令,信息,目录,用户名,账号,文

    linux命令更改用户?

    linux命令更改用户?,系统,密码,管理,用户,命令,环境,工作,地址,电脑,文件,lin

    linux修改用户名命令?

    linux修改用户名命令?,系统,密码,查询系统,代码,数字,用户名,命令,第三,电

    linux命令给用户授权?

    linux命令给用户授权?,系统,数字,管理,权限,命令,密码,工具,时间,软件,信息,l