代码之家  ›  专栏  ›  技术社区  ›  cllpse

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

  •  60
  • cllpse  · 技术社区  · 15 年前

    我想使用javascript和jquery处理F1-F12键。

    我不确定要避免哪些陷阱,目前我无法在Internet Explorer 8、Google Chrome和Mozilla Firefox 3之外的任何其他浏览器中测试实现。

    对完整的跨浏览器解决方案有什么建议吗?类似于测试良好的jquery库,或者只是普通的jquery/javascript?

    13 回复  |  直到 6 年前
        1
  •  20
  •   mcherm    15 年前

    我对此类问题的最佳来源是本页: http://www.quirksmode.org/js/keys.html

    他们所说的是,在Safari上,按键代码很奇怪,在其他地方都是一致的(除了IE上没有按键事件,但我相信按键是有效的)。

        2
  •  39
  •   matsev    12 年前

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

    单击键:

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

    按键组合:

    shortcut.add("Ctrl+Shift+A", function() {
        alert("Ctrl Shift A pressed");
    });
    
        3
  •  26
  •   William Brendel    15 年前

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

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

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

        4
  •  10
  •   Chris Baker    9 年前

    如果没有其他外部类,只需使用

    event.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>
    

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

    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;
    }
    td,
    th {
      border: 2px solid #aaa;
    }
    <html>
    
    <head>
      <title>Untitled</title>
      <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    </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>
        5
  •  9
  •   Aloiso Gomes    8 年前

    哇,这很简单。写这篇文章是我的错,为什么以前没人写?

    $(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);       
        });
    });
    
        6
  •  2
  •   keemor    7 年前

    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;
    };
    
        7
  •  0
  •   default locale    9 年前

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

    window.onkeypress = function(e) {
        if ((e.which || e.keyCode) == 116) {
            alert("fresh");
        }
    }
    
        8
  •  0
  •   Mohamad Shiralizadeh muhamad ridwan    8 年前

    当使用angular.js处理事件时,应该使用 ng-keydown 为了预防 pause in developer 在铬合金中。

        9
  •  0
  •   Christine    7 年前

    这对我有用。

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

    F2 - 113, F3 - 114, F4—115, 所以堡。

        10
  •  0
  •   Community miroxlav    7 年前

    捕获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>
    

    我借了一个 similar solution 从一篇相关的SO文章中发展出这一点。如果这对你也有用,请告诉我。

        11
  •  0
  •   Javier Menéndez Rizo    6 年前

    使用jquery可以这样做:

            $("#elemenId").keydown(function (e) {
                if(e.key == "F12"){
                    console.log(e.key);
                }
    
            });
    
        12
  •  -1
  •   KingRider    9 年前

    添加快捷方式:

    $.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/

        13
  •  -1
  •   Didier Aupest    6 年前

    我解决这个问题的方法是:

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

    用魔法数字 123 这是F12键。