【问题标题】:crossbrowser keypress for special keys (arrows,...) in javascriptjavascript中特殊键(箭头,...)的跨浏览器按键
【发布时间】:2023-03-11 17:02:01
【问题描述】:

我正在为终端构建浏览器界面。我需要同时捕捉字符(字母数字、点、斜线......)和非字符按键(箭头、F1-F12、......)。此外,如果用户按住某个键,那么重复按键会很好(应该重复调用该函数,直到释放键)。空格键、字符、...

我希望它尽可能跨浏览器(jQuery keypress 在该帐户上失败)。我也尝试过使用fork of jquery.hotkeys.js,但如果我理解正确的话,我无法在一个函数中同时捕获特殊键和字符键(对于前者应该使用 keydown,对于后者应该使用 keydown)。

是否有一个 JS 库可以让我同时捕获字符和特殊键?

我希望我没有遗漏一些明显的东西。 :)

更新澄清一下:我正在寻找可以隐藏浏览器实现细节的库。

【问题讨论】:

  • 你不需要任何东西。您对某些特定浏览器和 onkeydown 有任何问题吗?
  • 每个浏览器实现的关键事件都有点不同,我无法找到能够以合适的方式弥补所有这些差异的库。

标签: javascript keypress keydown keyup


【解决方案1】:

我最终使用了keycode.js,但我正在围绕 keydown、keypress 和 keyup 事件构建一个完整的事件管理系统,因为只有一个事件 (keydown) 不足以确定输入了哪个字符以及哪个键如果没有对应的字符,则按下。浏览器不兼容是这个挑战的额外好处。 :)

谢谢你们的回答,它帮助我完全理解了这个问题。

【讨论】:

    【解决方案2】:

    onkeydown 正是你所需要的。它捕获所有键,即使您按住一个按钮,它也会重复触发。

    <input type='text' onkeydown='return myFunc(this,event)'>
    
    <script>
       function myFunc(Sender,e){
         var key = e.which ? e.which : e.keyCode;
    
         if(key == someKey){ // cancel event and do something
            ev.returnValue = false;
            if(e.preventDefault) e.preventDefault();
            return false;
         }
       }
    </script>
    

    更新尝试使用 jQuery 进行测试

    $(document).ready(function(){
    $('#in').keydown(fn);
    });
    
    var cnt = 0;
    function fn(e){
       var key = e.keyCode ? e.keyCode : e.which;
       cnt++;
    
       if(cnt == 10) {
      alert('event was fired 10 times. Last time with key: '+key);
          cnt = 0;
       }
    }
    

    【讨论】:

    • 你确定它被重复触发了吗?根据this(见2.2)和我的测试,情况并非如此。
    • 我很确定,当用户按住向上/向下箭头时,我将它与我的网格组件中的导航一起使用。在 IE7+/FF/Chrome 中测试
    • 如果按下修饰键,在某些浏览器中它可能会重复触发按键事件,而不是 keyup 或 keydown。在某些浏览器中会。
    • 好吧,也许我们可以说在所有主流浏览器中都可以。在 Safari 中也可以。据我所知,在 Opera 中也是如此。
    • 嗯,它在我使用的浏览器上不起作用(Iceweasel,基于 FF 3.5.16)。 :) 请注意,FF 3.5 并不古老,只是因为 Mozilla 编号选择而显得如此。该解决方案在 FF7.0.1 和 IE9 中确实有效......虽然不完美,但如果没有更好的,我将不得不走那条路。感谢您向我指出!
    【解决方案3】:

    DOM 3 事件规范包括 key events,但它仍然是一个工作草案,因此可能还没有得到广泛支持,但应该很有帮助。

    对于将密钥代码转换为字符,您可能会发现Quriskmode 很有帮助。知道按下了哪个键以及哪些修饰符可以让你到达你想去的地方。请注意,您可能在将所有键盘映射到相同字符集时遇到问题,因为有些键盘具有其他键盘没有的键(例如 Microsoft“windows”键和 Apple 命令键)。可能需要进行一些试验和错误。

    哦,您可能会发现文章 JavaScript Madness: Keyboard Events 很有趣。

    【讨论】:

    • 感谢您的链接,我已经找到了。我想我不够清楚——问题是“我怎样才能避免这种疯狂?” :)
    • 您可能很容易获得 95%,但最后 5% 将非常困难。例如Mac 上的命令 (Apple) 键在 Safari 中给出代码 91,但在 Firefox 中给出代码 224。在 Mac 上,许多功能键永远不会到达浏览器,它们会做其他事情(例如公开操作)。
    猜你喜欢
    • 2012-02-12
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多