【问题标题】:Reject "control" keys on keyDown event在 keyDown 事件上拒绝“控制”键
【发布时间】:2011-10-14 16:20:13
【问题描述】:

在 JavaScript 或 jQuery 中过滤控制键最干净方法是什么。 控制键是指任何不是 A-Z、0-9 或特殊字符(即!、@、# 等)的键。我只是想过滤掉诸如“Shift”、“Alt”、F1- F9、Caps Lock 等键。

我确信我可以从事件参数中检查每个单独的 ASCII 码……但我想知道是否有“更清洁”的解决方案。

注意:我正在为 IE 8 开发一个应用程序

【问题讨论】:

    标签: javascript jquery dom-events keydown


    【解决方案1】:

    我选择了这样的东西:

    function (e, inputElement) {
        // If the user gives the textbox any keyboard input, mark the input box as "dirty"
        var scope = this;
        var k = e.which;
    
        // Verify that the key entered is not a special key
        if (k == 20 /* Caps lock */
         || k == 16 /* Shift */
         || k == 9 /* Tab */
         || k == 27 /* Escape Key */
         || k == 17 /* Control Key */
         || k == 91 /* Windows Command Key */
         || k == 19 /* Pause Break */
         || k == 18 /* Alt Key */
         || k == 93 /* Right Click Point Key */
         || ( k >= 35 && k <= 40 ) /* Home, End, Arrow Keys */
         || k == 45 /* Insert Key */
         || ( k >= 33 && k <= 34 ) /*Page Down, Page Up */
         || (k >= 112 && k <= 123) /* F1 - F12 */
         || (k >= 144 && k <= 145 )) { /* Num Lock, Scroll Lock */
            return false;
        }
        else {
            scope.setPointValueDirtyStatus(inputElement, true);
        }
    }
    

    【讨论】:

    • 是的。蛮力似乎是必要的:(
    • BTW 什么是“右键点键”?
    【解决方案2】:

    使用event.which -- 每个键都有自己的代码。 Control 键是 17,Shift 键是 16,@ 是两个不同的键,16 后跟 50。使用该页面上的演示找出您想要接受或忽略的每个键返回的值。

    【讨论】:

      【解决方案3】:

      有点老话题,但在 2021 年 event.which 已弃用,event.keyCode 也已弃用。但是,要获得有效的用户输入键,您只需一个简单的条件即可。

      if (event.key.length === 1) {
        // do stuff
      }
      

      【讨论】:

        【解决方案4】:

        这将只允许 a-z(代码 65 - 90)、0-9 (48 - 57)。请注意,shift 应该是允许的,因为这是将文本转换为大写的必要条件。

        $("...").keydown(function(ev){
            var k = ev.which;
            if(!(k >= 65 && k <= 90) /* a-z */
            || !(k >= 48 && k <= 57) /* numbers */
            || !(k >= 96 && k <= 111) /* numeric keyboard*/
            || k != 59 || k != 61 || k != 188 || k != 190 || k != 191 || k != 191
            || k != 192 || !(k >= 219 && k <= 222) || k != 32 /* Comma's,  etc. */
            || ev.ctrlKey || ev.altKey/* || ev.shiftKey*/){
                //Filter
            }
        })
        

        【讨论】:

        • 如何处理像德语 umlats 这样的 unicode 字符?大写?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2014-08-11
        • 2016-06-06
        相关资源
        最近更新 更多