Jquery,禁用浏览器快捷键

7
我正在尝试为我的项目屏蔽一些浏览器快捷键,例如如果用户按下F1键,则应打开项目中的新页面,但浏览器会打开其帮助页面。 如果我按Ctrl+N,则它应该打开特定页面,但浏览器会打开新窗口。
这是我的代码。(FIDDLE
$('body').keypress(function(event){

            if (event.keyCode == 17 && event.keyCode == 110)
            {
                alert("New");   
            }
            else
            {
                event.preventDefault(); 
            }


          });

我认为您必须分别处理控制键和字符键,并存储修改键的状态。如果我没记错,在Opera和Firefox上至少可以配置,但无法覆盖浏览器的决定是否将新视口打开为标签页或新窗口。两个附注:建议使用类型安全比较运算符(===而不是==)和规范化的which属性(如JQuery API文档所建议)。 - collapsar
@collapsar,你能否在 jsfiddle 上演示一下吗? - Shivam Pandya
是的,正如 collapsar 所说,任何与您的操作系统或浏览器有特殊含义的键组合都不会引发事件,因此您无法处理它们。 - ejosafat
5个回答

2
如果您可以使用jQuery,这是一个很好的代码片段,可以完全实现您想要的功能:

var isCtrlHold = false;
var isShiftHold = false;

$(document).keyup(function (e) {
    if (e.which == 17) //17 is the code of Ctrl button
        isCtrlHold = false;
    if (e.which == 16) //16 is the code of Shift button
        isShiftHold = false;
});
$(document).keydown(function (e) {
    if (e.which == 17)
        isCtrlHold = true;
    if (e.which == 16)
        isShiftHold = true;
    
    ShortcutManager(e);
});

function ShortcutManager(e){
    //F1:
    if (e.which == 112) { //112 is the code of F1 button
        e.preventDefault(); //prevent browser from the default behavior
        alert("F1 is pressed");
    }
    
    //Ctrl+K:
    if (isCtrlHold && e.which == 75) { //75 is the code of K button
        e.preventDefault(); //prevent browser from the default behavior
        alert("Ctrl+K is pressed");
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Press F1 or press Ctrl+K

JSFiddle上测试。

您可以在此处找到所有键的JavaScript代码: https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes


2
似乎您无法干预浏览器对于具有特殊语义的ctrl+键组合的操作(至少在chrome 34上是这种情况)。请查看this fiddle,其中演示了一些查询按键和按键组合的方法。请注意,按下ctrl+n后,keydown处理程序仍会触发状态转换(通过检查按键序列ctrl+nshift+nshift+n的警报来证明)。
然而,我没有找到一种阻止浏览器占用具有UI意义的按键的方法(我认为从用户的角度来看这是好的)。
编辑:我发现this SO answer解决了chrome上的问题(注意:我尚未针对当前版本的chrome测试此解决方案)。

0

试试这个

$(window).keydown(function(event) {
    if(event.ctrlKey && event.keyCode == 78) { 
        $('body').html("Hey! Ctrl+N event captured!");
            event.preventDefault(); 
        }
    });
});

不可否认,这个片段无论语法错误如何都不会起作用,因为(event.ctrlKey && enent.keyCode)的概念不起作用。您可以在jsFIddle上检查修改后的代码(修改语法错误):https://jsfiddle.net/7qhwj8oa/1/ 我已经发布了一个工作示例作为答案。 - Moshtaf

0

在 Firefox 中我尝试了这个

$(document).ready(function(){
    $(document).keyup(function (e) {
       var code = (e.keyCode ? e.keyCode : e.which);

            if(code==112)
            {
                alert("F1 pressed");
            }

    });
 });

f1 - f12:112-123 在主要浏览器上工作

Explorer 5-7: almost
Firefox 2.0 Windows : yes
Firefox 2.0 Mac: yes
Safari 1.3:almost
Opera 9 Windows:yes
Opera 9 Mac: incorrect

我参考的源代码是http://www.quirksmode.org/js/keys.html

-1
<html>
<head>
<script src="http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js"></script>
<script>
    shortcut.add("F1",function() {
    alert("F1");
});

</script>
</head>
<body>
Please Key press F1

</body>
</html>

你可以尝试这个快捷脚本,它很容易使用。

你是...算了吧,嘘 - AyukNayr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接