使用JavaScript和jQuery,跨浏览器处理按键事件(F1-F12)


77

我想使用JavaScript和jQuery处理F1-F12键。

我不确定应该避免什么陷阱,并且我目前无法在Internet Explorer 8,Google Chrome和Mozilla FireFox 3之外的任何其他浏览器中测试实现。

对完整的跨浏览器解决方案有什么建议吗?像经过良好测试的jQuery库,还是仅仅是普通的jQuery / JavaScript?

Answers:



47

我同意William的观点,一般来说,劫持功能键是一个坏主意。也就是说,我发现了一种快捷方式库,它添加了此功能以及其他键盘快捷键和组合。

一次按键:

shortcut.add("F1", function() {
    alert("F1 pressed");
});

击键组合:

shortcut.add("Ctrl+Shift+A", function() {
    alert("Ctrl Shift A pressed");
});

1
看起来像一个非常不错的图书馆!感谢分享。
AlvaroFlañoLarrondo 2015年

即使具有F5-F11功能,也可以完美地在最新的Chrome上运行
Nicolas Zozol '16

27

我不确定是否可以拦截功能键,但是我会避免同时使用功能键。浏览器使用功能键来执行各种任务,其中一些很常见。例如,在Linux上的Firefox中,至少有六个或七个功能键被保留供浏览器使用:

  • F1(帮助),
  • F3(搜索),
  • F5(刷新),
  • F6(焦点地址栏),
  • F7(插入符号浏览模式),
  • F11(全屏模式),和
  • F12(由多个附加组件(包括Firebug)使用)

最糟糕的是,不同操作系统上的不同浏览器对不同事物使用不同的密钥。这需要考虑很多差异。您应该坚持使用更安全,不常用的组合键。


6
是的,我知道某些键是保留的。永远不会少;我想使用任何不是的键。
cllpse

1
在我的计算机上,所有F键都已保留。通过某些自定义快捷方式使用Opera。从不依赖于“通常不保留的密钥”约定。
gizmo,2009年

是否有特定原因?我发现很难想到需要使用功能键的情况。这纯粹是我的好奇心。我并不是想让您摆脱困境,只是建议其他方法。
威廉·布伦德尔

5
“我想使用任何不需要的键”-事实是,您无法以编程方式告诉您哪些键未保留。接管功能键可能对您的应用程序来说很好,但是很难说。
Paul D. Waite,2010年

3
@WilliamBrendel我正在使用手持式工业扫描仪。我必须使用功能键。
Bmo 2014年

17

哇,这很简单。我怪写这个,为什么以前没人做呢?

$(function(){
    //Yes! use keydown 'cus some keys is fired only in this trigger,
    //such arrows keys
    $("body").keydown(function(e){
         //well you need keep on mind that your browser use some keys 
         //to call some function, so we'll prevent this
         e.preventDefault();

         //now we caught the key code, yabadabadoo!!
         var keyCode = e.keyCode || e.which;

         //your keyCode contains the key code, F1 to F12 
         //is among 112 and 123. Just it.
         console.log(keyCode);       
    });
});

谢谢,prefentDefault调用是关键。
拉尔斯·布林霍夫

顺利双
关岛

11

无需其他外部类,您只需使用以下代码即可创建个人hack代码

event.keyCode

对所有人的另一个帮助,我认为这是截取keyCode的测试页面(只需复制并粘贴到new file.html中即可测试您的事件)。

 <html>
 <head>
 <title>Untitled</title>
 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
 <style type="text/css">
 td,th{border:2px solid #aaa;}
 </style>
 <script type="text/javascript">
 var t_cel,tc_ln;
 if(document.addEventListener){ //code for Moz
   document.addEventListener("keydown",keyCapt,false); 
   document.addEventListener("keyup",keyCapt,false);
   document.addEventListener("keypress",keyCapt,false);
 }else{
   document.attachEvent("onkeydown",keyCapt); //code for IE
   document.attachEvent("onkeyup",keyCapt); 
   document.attachEvent("onkeypress",keyCapt); 
 }
 function keyCapt(e){
   if(typeof window.event!="undefined"){
    e=window.event;//code for IE
   }
   if(e.type=="keydown"){
    t_cel[0].innerHTML=e.keyCode;
    t_cel[3].innerHTML=e.charCode;
   }else if(e.type=="keyup"){
    t_cel[1].innerHTML=e.keyCode;
    t_cel[4].innerHTML=e.charCode;
   }else if(e.type=="keypress"){
    t_cel[2].innerHTML=e.keyCode;
    t_cel[5].innerHTML=e.charCode;
   }
 }
 window.onload=function(){
   t_cel=document.getElementById("tblOne").getElementsByTagName("td");
   tc_ln=t_cel.length;
 }
 </script>
 </head>
 <body>
 <table id="tblOne">
 <tr>
 <th style="border:none;"></th><th>onkeydown</th><th>onkeyup</th><th>onkeypress</td>
 </tr>
 <tr>
 <th>keyCode</th><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
 </tr>
 <tr>
 <th>charCode</th><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
 </tr>
 </table>
 <button onclick="for(i=0;i<tc_ln;i++){t_cel[i].innerHTML='&nbsp;'};">CLEAR</button>
 </body>
 </html>

这是一个有效的演示,因此您可以在这里尝试:


1
感谢@paladinux,您的代码对我来说很好用。我正在自定义它以在按键时调用自定义功能。但是我面临一个问题。每当我键入字符'q,r,s,t,u'时,页面就会自动执行自定义功能,因为这些键具有与功能键F2 ... F7(113..118)相同的键代码
raj

5

ES6中针对现代浏览器和IE11(带有移植到ES5)的解决方案:

//Disable default IE help popup
window.onhelp = function() {
    return false;
};
window.onkeydown = evt => {
    switch (evt.keyCode) {
        //ESC
        case 27:
            this.onEsc();
            break;
        //F1
        case 112:
            this.onF1();
            break;
        //Fallback to default browser behaviour
        default:
            return true;
    }
    //Returning false overrides default browser event
    return false;
};

也许修复this.onX事件,使示例更易于移植?
mix3d

1

这对我有用。

if(code ==112) { alert("F1 was pressed!!"); return false; }

F2-113,F3-114,F4-115等。


1

捕获F1-F12键的问题之一是默认功能也必须被覆盖。这是F1“帮助”键的实现示例,其中的替代会阻止默认帮助弹出窗口。此解决方案可以扩展为F2-F12键。同样,此示例有意不捕获组合键,但是也可以更改此

<html>
<head>
<!-- Note:  reference your JQuery library here -->
<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
</head>
<body>
    <h1>F-key trap example</h1>
    <div><h2>Example:  Press the 'F1' key to open help</h2></div>
    <script type="text/javascript">
        //uncomment to prevent on startup
        //removeDefaultFunction();          
        /** Prevents the default function such as the help pop-up **/
        function removeDefaultFunction()
        {
            window.onhelp = function () { return false; }
        }
        /** use keydown event and trap only the F-key, 
            but not combinations with SHIFT/CTRL/ALT **/
        $(window).bind('keydown', function(e) {
            //This is the F1 key code, but NOT with SHIFT/CTRL/ALT
            var keyCode = e.keyCode || e.which;
            if((keyCode == 112 || e.key == 'F1') && 
                    !(event.altKey ||event.ctrlKey || event.shiftKey || event.metaKey))
             {
                // prevent code starts here:
                removeDefaultFunction();
                e.cancelable = true;
                e.stopPropagation();
                e.preventDefault();
                e.returnValue = false;
                // Open help window here instead of alert
                alert('F1 Help key opened, ' + keyCode);
                }
            // Add other F-keys here:
            else if((keyCode == 113 || e.key == 'F2') && 
                    !(event.altKey ||event.ctrlKey || event.shiftKey || event.metaKey))
             {
                // prevent code starts here:
                removeDefaultFunction();
                e.cancelable = true;
                e.stopPropagation();
                e.preventDefault();
                e.returnValue = false;
                // Do something else for F2
                alert('F2 key opened, ' + keyCode);
                }
        });
    </script>
</body>
</html>

我从相关的SO文章中借用了类似的解决方案来进行开发。让我知道这是否对您也有用。


0

如果可行,请尝试此解决方案。

window.onkeypress = function(e) {
    if ((e.which || e.keyCode) == 116) {
        alert("fresh");
    }
}

您如何猜测116的值?
Basile Starynkevitch

@BasileStarynkevitch请参阅本一个.. help.adobe.com/en_US/AS2LCR/Flash_10.0/...
奥菲尔阿提亚

@BasileStarynkevitch我通过在正确的位置设置断点并检查event.that(具有适当信息的事件属性)来找到我的关键代码值
Juan


-1

添加快捷方式:

$.Shortcuts.add({
    type: 'down',
    mask: 'Ctrl+A',
    handler: function() {
        debug('Ctrl+A');
    }
});

开始对快捷方式作出反应:

$.Shortcuts.start();

在“另一个”列表中添加快捷方式:

$.Shortcuts.add({
    type: 'hold',
    mask: 'Shift+Up',
    handler: function() {
        debug('Shift+Up');
    },
    list: 'another'
});

激活“另一个”列表:

$.Shortcuts.start('another');
Remove a shortcut:
$.Shortcuts.remove({
    type: 'hold',
    mask: 'Shift+Up',
    list: 'another'
});

停止(解除绑定事件处理程序):

$.Shortcuts.stop();


教程:http
//www.stepanreznikov.com/js-shortcuts/


-1

我对这个问题的解决方案是:

document.onkeypress = function (event) {
    event = (event || window.event);
    if (event.keyCode == 123) { 
         return false;
    }
}

带有魔术数字123的钥匙F12。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.