当我按.
时,它会触发三个事件,keydown
,keypress
和keyup
。
keydown
which: 190 == ¾
keyCode: 190 == ¾
keypress
which: 46 == .
keyCode: 46 == .
keyup
which: 190 == ¾
keyCode: 190 == ¾
当我按delete
时,它会触发两个事件,keydown
和keyup
。
keydown
which: 46 == .
keyCode: 46 == .
keyup
which: 46 == .
keyCode: 46 == .
我想按.
并能够获得相应的字符(46 == .
)。但是在keydown
和keyup
上,我得到190
¾
。在keypress
我得到正确的值,但是当我按delete
时,不会触发此事件。
当我按delete
时,我会在46
和keydown
上获得代码keyup
。但代码46
是.
而不是delete
。
如果是.
按下了delete
键还是{{1}}键,我怎样才能制作一个事件来捕捉两个键并区分它们?
要测试的网页:http://jsfiddle.net/Eg9F3/
答案 0 :(得分:2)
我认为最好的解决方案是映射您想要的键(demo),然后使用e.which
来交叉引用按下的键。有good reference个跨浏览器keyCode
值,在这种情况下有效,因为jQuery会对e.which
值进行规范化。
var keys = {
46 : 'del',
190 : '.'
};
$("textarea").bind('keyup', function(e){
$('#r').append( 'keyup (' + e.which + '): ' + (keys[e.which] || String.fromCharCode(e.which)) );
});
这类似于jQuery UI使用的方法 - 请参阅文件顶部的密钥代码交叉引用?它也是我在keycaster插件中使用的方法。
答案 1 :(得分:1)
事实上它很奇怪,但这是逻辑。
String.fromCharCode函数使用真实的char代码,而不是KB动作(左,删除...)
为什么不通过keyCode过滤?
答案 2 :(得分:1)
我强制使用与Firefox example on jsFiddle
相同的行为$("textarea").keydown(function(e) {
// if the key pressed was found on the list of specialChars
if (specialChars[e.keyCode])
{
// triggers the fake event
$("textarea").trigger("chromekeypress", e);
// temporary avoid keypress from firing
$("textarea").unbind("keypress");
setTimeout(function(){ $("textarea").bind("keypress", handleKey); },10);
}
});
$("textarea").keypress(handleKey); // main event
$("textarea").bind("chromekeypress", chromeKeyPress); // chrome workaround
function chromeKeyPress(i,e){
e.type="chromekeypress";
e.which = 0; // copy Firefox behavior, which == 0 means a special key pressed
handleKey(e); // fires the main event
}
function handleKey(e) {
// which is going to be 0 if it is a special key
// and keycode will have the code of the special key
// or
// which will have the value of the key
$("#r").html($("#r").html() + "\n" +
e.type + "\n" +
" which: " + e.which + " == " + String.fromCharCode(e.which) + "\n" +
" keyCode: " + e.keyCode + " == " + String.fromCharCode(e.keyCode) + "\n" +
"");
}
答案 3 :(得分:0)
“keypress”处理程序中“which”的值与“keydown”或“keyup”处理程序中“which”的含义不同。在那些中,它是键盘上键的键码,而不是一个字符序号。在“按键”中,它是角色,但你没有获得Del
的“按键”(正如你所注意到的)。
因此,“keypress”处理程序(“。”)中的46与Del
的“keydown”和“keyup”事件不同。
您可能应该使用“keydown”或“keyup”并检查密钥代码。