【发布时间】:2018-03-02 00:29:58
【问题描述】:
编辑澄清——链接到的问题没有回答问题 我在这里问,因为它仍然描述了不 充分指定哪个更正确使用,哪个更 可靠,更国际友好,最能 容易地从按下的那些键中提供键和值来获取 可打印和不可打印字符。最明白当每个 事件触发,但试图从/或获取可操作的数据, 尤其是在另一个问题中指出,使用它是不好的形式 在这个特定用例的例子中,一个更好的描述 这些功能将有所帮助。非常感谢您的 对学习和理解的贡献。
我必须同时使用 keypress 和 keydown 函数来以可靠的方式为我正在创建的程序捕获键盘事件。我担心当我开始涉足国际键盘时,必要的解决方案必须非常富有想象力。更多地了解这两个函数的实际行为方式肯定会澄清我的进一步进展以及其他许多进展。对该主题的研究已经产生了许多不同的方法,并且没有那么明确的理解易于使用。主要是一堆不同的黑客。
我最大的问题是区分普通字符“abc”和“123”,以及“enter”或“backspace”等不可打印的字符。句号或小数点是它自己的动物。我的代码可以正常工作,但是当我在正常输入字母和数字的基础上为几种不同的国际键盘布局提供 100 多个可编程键盘快捷键时,我可能会遇到麻烦。
对 keypress 和 keydown 以及可能的 keyup 的区别的一个很好的解释将受到许多人的极大赞赏。
非常感谢您的帮助!
此代码有效,但更好的理解可能会改变其形式。
keypress 主要捕获可打印的字符
keydown 捕获不可打印的键,例如回车键和退格键
.keypress(function(key)
{
/* $(".temp").append(key.shiftKey + ' -- ' + key.which + ': ' + key.key + '<br>'); */
console.log(key.shiftKey + ' -- ' + key.which + ': ' + String.fromCharCode(key.which));
KeyBindHandler(key);
})
.keydown(function(key)
{
console.log(key.shiftKey + ' -- ' + key.which + ': ' + String.fromCharCode(key.which));
if ($.inArray(key.which, [8, 13, 46, 112, 113, 114, 115, 116, 110, 190]) > -1)
KeyBindHandler(key);
})
function KeyBindHandler(key)
{
key.preventDefault();
if (key.which == 8 || key.which == 46) // backspace delete
BackSpace();
else if (key.which == 13) // enter keys
Enter();
else if (key.which == 110 || key.which == 190) // period or decimal
ButtonHandler($('#Decimal'));
else if ($.inArray(key.which, [40, 41, 42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57]) > -1)
{
if (key.shiftKey)
{
switch (key.which)
{
case 40: // (
ButtonHandler($('#Open_peren'));
break;
case 41: // )
ButtonHandler($('#Close_peren'));
break;
case 45: // shift and key minus posneg
math_io.PosNegHandler();
$(".io_in").html(math_io.Display());
break;
}
}
else // operands and numbers
{
switch (key.which)
{
case 47:
ButtonHandler($('#Division'));
break;
case 42:
ButtonHandler($('#Multiplication'));
break;
case 45:
ButtonHandler($('#Subtraction'));
break;
case 43:
ButtonHandler($('#Addition'));
break;
default:
ButtonHandler($('#' + String.fromCharCode(key.which)));
}
}
}
else // F1 to F5
{
switch (key.which)
{
case 112:
NavButtonHandler($('#Standard'));
break;
case 113:
NavButtonHandler($('#Advanced'));
break;
case 114:
NavButtonHandler($('#Scientific'));
break;
case 115:
NavButtonHandler($('#Advanced_Scientific'));
break;
case 116:
NavButtonHandler($('#Graphing'));
break;
}
}
}
【问题讨论】:
-
简短的回答是,
keypress是关于键入的字符,例如,您最终在 Word 等程序中看到的内容。keydown是关于键盘按键,检测与键盘的物理交互。例如,按下 Shift 键不会触发keypress事件,因为 Shift 是一个修饰键。 -
@Chris G - 虽然您的评论是正确的,但它并没有回答问题。
-
两个问题:1.这些键盘事件是否来自输入元素? 2. 您选择使用
.which而不是.key是否有明显的原因?您的代码只需解码.which的输出,该值由.key提供,无需额外步骤。 -
你永远不会在 Stack Overflow 上得到关于“哪个更正确使用、哪个更可靠、哪个更国际友好”的描述,因为这些是意见,不在话题。至于事件及其论点的描述,我找到MDN to have outstanding documentation。
标签: javascript jquery keypress keydown