【问题标题】:action by key press按键动作
【发布时间】:2011-11-28 11:04:27
【问题描述】:

我正在设计一个基于网络的会计软件。例如,每当用户按 N 键时,我都想打开“新会计凭证”。并在他/她按 S 键时打开“设置”。

我看到了一些基于 JavaScript 和 jQuery 的脚本。但他们并没有完全发挥作用。谁能帮帮我?

我试过这个脚本:

var code = (e.keyCode ? e.keyCode : e.which);
if(code == 13) { //Enter keycode
   //Do something
}

【问题讨论】:

  • 你能发布代码吗?这将有助于回答。
  • “每当用户按 N 键” - 我不确定“会计文件”对您意味着什么,但我希望用户可以在某些字段中输入帐户名称和其他非数字信息,那么当他们想在帐户名称中添加“N”或“S”时会发生什么?
  • 刚刚看到您的代码更新 - 它有什么问题?它在评论中说它正在尝试捕获 Enter 键。看看this table of key codes.

标签: javascript jquery onkeypress


【解决方案1】:
$(document).bind('keyup', function(e){
    if(e.which==78) {
      // "n"
    }
    if(e.which==83) {
      // "s"
    }
});

防止输入被聚焦:

$("body").on("focus",":input", function(){ $(document).unbind('keyup'); });
$("body").on("blur",":input", function(){ $(document).bind('keyup', function(e){ etc.... });

您可能希望将bind 函数放入它自己的函数中,这样您就不会重复代码。例如:

function bindKeyup(){
    $(document).bind('keyup', function(e){
      if(e.which==78) {
        // "n"
      }
      if(e.which==83) {
        // "s"
      }
    });
}
$("body").on("focus",":input", function(){ $(document).unbind('keyup'); });
$("body").on("blur",":input", function(){ bindKeyup(); });

【讨论】:

  • 谢谢托马斯。但是,如果用户的光标集中在文本框上,如何防止此功能?
  • 感谢托马斯的回答。无意中发现了和你的答案类似的东西。它也很好用。看看吧:openjs.com/scripts/events/keyboard_shortcuts
  • 你能搞定这个吗?
【解决方案2】:

您可以使用 .keypress().keyup() 方法在 jQuery 中解除按键技术,这是一个简单的示例:

$(document).keyup(function(event) { // the event variable contains the key pressed
 if(event.which == 78) { // N keycode
   //Do something
 }
});

这里是键码列表:http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

更新 1

.keyup 和 .keydown 有不同的影响 - 根据@ThomasClayson 的 cmets -:keyup 是最好的选择,因为如果按住键,按键将重复。它为每个插入的字符注册一个事件。它也没有注册修饰键,例如 shift(虽然这里没有必要,但可能需要记住)

更新 2

这是来自 jQuery keyup 文档网站:

要确定按下了哪个键,请检查事件对象 传递给处理函数。虽然浏览器使用不同 属性来存储这些信息,jQuery 规范化 .which 属性,以便您可以可靠地使用它来检索密钥代码。这 代码对应于键盘上的一个键,包括特殊代码 诸如箭头之类的键。

意思是which.event 是您确定使用哪个密钥所需的全部内容。谢谢@nnnnnn

【讨论】:

  • keyup 是最好的选择,因为如果按住键,keypress 将重复。它为每个插入的字符注册一个事件。它也不会注册修饰键,例如 shift(虽然这里没有必要,但可能需要记住)。
  • @ThomasClayson 谢谢 - 相应地更新了我的答案......总是在学习我......
  • 如果你使用 jQuery,你应该可以放心地假设 event.which 会在那里 - jQuery 会为你规范化它。
  • @nnnnnn 谢谢 - 我什至没有问这个问题,我在这里学到了两件事......谢谢...... :-)
  • @ManseUK 对 jquery 的了解远不止于眼前
【解决方案3】:

您需要阅读事件对象的.keyCode() 属性。您可以询问它以发现按下了哪个键并采取相应措施。我还建议您在快捷键中添加修饰键,例如 ShiftAlt,这样当有人无意中输入输入时,面板不会弹出向上。在下面的示例中,我使用了 Shift

$(document).keyup(function(e) {
    if (e.shiftKey) {
        switch(e.keyCode ? e.keyCode : e.which) {
            case 78: // N pressed
                myNPressedHandler();
                break;
            case 83: // S pressed
                mySPressedHandler();
                break;
        }
    }
} 

【讨论】:

  • 再次批评...大声笑,我很抱歉! Keypress 是一个不好检查的事件,如果用户按住相关键,它会反复触发。最好检查的是keyup,因为这是确定的“我按下了一个键并完成了按下”。 keypress 也不会像您建议的那样注册 shift 和 alt 键。 api.jquery.com/keypress
  • @Thomas 大声笑 - 对我来说,现在是星期一的一大早,我的手比我的手指工作得更快。
  • 没关系。 :) 你的回答非常好,我的意思不是听起来像个聪明人!只是传递我所犯和积累的错误和知识。 :p
  • 谢谢,作为我今天早上愚蠢的一个例子,我写了“手打字比我的手指快”,我的意思是“比我的大脑快”。有了这个,我要休息一段时间了,哈哈 :)
【解决方案4】:
$(document).bind('keypress', function(e) {
    var keycode= (e.keyCode ? e.keyCode : e.which);
       if(keyCode==78) {
      // "n"
    }else if(keyCode==83) {
      // "s"
    }

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多