为什么人们会写出像
这样的陈述e.keyCode ? e.keyCode : e.charCode
有些人还使用e.which
有人可以解释一下吗?
答案 0 :(得分:97)
始终如一地处理关键事件并非易事。
首先,有两种不同类型的代码:键盘代码(表示用户按下的键盘上的键的数字)和字符代码(表示Unicode字符的数字)。您只能在keypress
事件中可靠地获取字符代码。请勿尝试获取keyup
和keydown
事件的字符代码。
其次,您在keypress
事件中获得的值与keyup
或keydown
事件中获得的值不同。
我建议将this page作为有用的资源。总结:
如果您对检测用户输入字符感兴趣,请使用keypress
事件。 IE奇怪地仅将字符代码存储在keyCode
中,而所有其他浏览器将其存储在which
中。有些(但不是全部)浏览器也会将其存储在charCode
和/或keyCode
中。一个示例按键处理程序:
function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
alert(charStr);
}
如果您对检测不可打印的密钥(例如光标键)感兴趣,请使用keydown
事件。此处keyCode
始终是要使用的属性。请注意,keyup
个事件具有相同的属性。
function(evt) {
evt = evt || window.event;
var keyCode = evt.keyCode;
// Check for left arrow key
if (keyCode == 37) {
alert("Left arrow");
}
}
答案 1 :(得分:9)
这是条件陈述。
如果浏览器支持e.keyCode,则接受e.keyCode else e.charCode。
类似于
var code = event.keyCode || event.charCode
event.keyCode:返回按键事件中非字符键的Unicode值或任何其他类型键盘事件中的任何键。
event.charCode:返回按键事件期间按下的字符键的Unicode值。
答案 2 :(得分:4)
keyCode,表示以数值形式按下的实际键盘键。存在的原因是keyCode在Internet Explorer中可用,而在FireFox等W3C浏览器中可用。
charCode类似,但在这种情况下,您将检索按下的字符的Unicode值。例如,字母“A。”
JavaScript表达式:
var keyCode = e.keyCode ? e.keyCode : e.charCode;
基本上说以下内容:
如果e.keyCode属性存在,请将变量keyCode设置为其值。否则,将变量keyCode设置为e.charCode属性的值。
请注意,检索keyCode或charCode属性通常需要确定IE和W3C中事件模型之间的差异。有些需要编写如下代码:
/*
get the event object: either window.event for IE
or the parameter e for other browsers
*/
var evt = window.event ? window.event : e;
/*
get the numeric value of the key pressed: either
event.keyCode for IE for e.which for other browsers
*/
var keyCode = evt.keyCode ? evt.keyCode : e.which;
编辑:根据Tor Haugen的评论更正了我对charCode的解释。
答案 3 :(得分:4)
好的,这是解释。
e.keyCode - 用于获取代表键盘上键的数字
e.charCode - 表示键盘上键的unicode字符的数字
e.which - (特定于jQuery)是jQuery中引入的属性(不要在普通的javascript中使用)
以下是获取keyCode和charCode
的代码段<script>
// get key code
function getKey(event) {
event = event || window.event;
var keyCode = event.which || event.keyCode;
alert(keyCode);
}
// get char code
function getChar(event) {
event = event || window.event;
var keyCode = event.which || event.keyCode;
var typedChar = String.fromCharCode(keyCode);
alert(typedChar);
}
</script>
答案 4 :(得分:0)
我(作为自己的人)写了这句话,因为我想检测用户在不同浏览器上键入的键。
在Firefox中,例如,字符有&gt; 0 charCode和0 keyCode,以及箭头和&amp;等键。 backspace有&gt; 0 keyCode和0 charCode。
但是,使用此语句可能会出现问题,因为“碰撞”是可能的。 例如,如果要区分Delete和Period键,则不起作用,因为Delete具有keyCode = 46且Period具有charCode = 46。
答案 5 :(得分:-2)
使用jQuery时添加属性event.which
以避免浏览器差异。 See docs
如果您不使用jQuery,which
属性将是未定义的。