专业编程基础技术教程

网站首页 > 基础教程 正文

keyCode 与 charCode 区别

ccvgpt 2024-08-27 13:36:39 基础教程 12 ℃

键盘事件拥有两个属性,keyCode和CharCode,他们之间有一些不一样之处。keyCode表示用户按下键的实际的编码,而charCode是指用户按下字符的编码。

IE下

keyCode 与 charCode 区别

keyCode:对于keypress事件,表示按下按键的Unicode字符;对于keydown/keyup 事件,表示按下按键的数字代码。无charCode属性。

DOM标准下

keyCode: 表示按键的数字代码。 (表示用户按下键的实际的编码,即用户实际敲击的按钮,不区分大小写,字母"a"和"A"都是显示"65",

即键盘上"A"键的数字代码是"65")

charCode:表示按键的Unicode值。(表示用户按下字符的编码,返回输入的字符的编码,区分大小写,字母"a"显示"97",字母"A"显示"65")

关于按键的数字代码与按键的Unicode值的区别,其主要区别在于大小写,当然也要考虑keyCode与charCode属性在浏览器中的兼容性

实例1:

<html>
<head>
<title>键盘事件</title>
<script language="javascript">
function handle(oEvent){
if(window.event) oEvent = window.event; //处理兼容性,获得事件对象
var oDiv = document.getElementById("display");
oDiv.innerHTML += oEvent.type + ": keyCode:" + oEvent.keyCode + " charCode:" + oEvent.charCode + "<br>";
}
window.onload = function(){
var oTextArea = document.getElementsByTagName("textarea")[0];
oTextArea.onkeydown = handle; //监听所有键盘事件
oTextArea.onkeypress = handle;
oTextArea.onkeyup = handle;
}
</script>
</head>
<body>
<textarea rows="4" cols="50"></textarea>
<div id="display"></div>
</body>
</html>

当我按下"a"键(注意是小写的字母)时,

在火狐中会得到

keydown:keyCode is 65 charCode is 0

keypress:keyCode is 0 charCode is 97

keyup: keyCode is 65 charCode is 0

在谷歌中会得到

keydown:keyCode is 65 charCode is 0

keypress:keyCode is 97 charCode is 97

keyup: keyCode is 65 charCode is 0

在IE中会得到

keydown:keyCode is 65 charCode is undefined

keypress:keyCode is 97 charCode is undefined

keyup: keyCode is 65 charCode is undefined

而当我按下shift键时,

在火狐中会得到

keydown:keyCode is 16 charCode is 0

keyup: keyCode is 16 charCode is 0

不会得到任何的charCode值,因为按shift并没输入任何的字符,而且也不会触发keypress事件。

在谷歌中会得到

keydown:keyCode is 16 charCode is 0

keyup: keyCode is 16 charCode is 0

在IE中会得到

keydown:keyCode is 16 charCode is undefined

keyup: keyCode is 16 charCode is undefined

实例2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>推箱子实例</title>
<style type="text/css">
#box {width:110px; height:110px; position:absolute; left:10px; top:10px;}
</style>
<script type="text/javascript">
var x = 10, y = 10;
window.onload = function(){
document.onkeydown = function(event){
var code;
//获取事件对象
if(window.event) {
code = window.event.keyCode;
} else {
code = event.keyCode;
}
switch(code) {
case 37: //左
x--;
break;
case 38: //上
y--;
break;
case 39: //右
x++;
break;
case 40: //下
y++;
break;
}
//更新箱子的位置
document.getElementById('box').style.left = x + 'px';
document.getElementById('box').style.top = y + 'px';
}
}
</script>
</head>
<body>
<div id="box"><img src="bg.png" width="110" height="110"/></div>
</body>
</html>

注意: 要想实现推箱子的效果, <div>元素样式必须设置成绝对定位

小结:

1.在keydown事件里面,事件包含了keyCode – 用户按下的按键的物理编码。

2.在keypress里,keyCode包含了字符编码,即表示字符的ASCII码(IE浏览器)。

如果你想获取用户实际敲击的按钮,用keydown事件来获取事件对象,并获取keyCode值,这在所有浏览器都行的通。(onkeydown事件,采用keycode属性)

另一方面,如果你想获取用户输入的字符(按键的Unicode值),那么就使用keypress来获取,然后获取charCode(火狐和safari),

但是IE没有charCode属性,其解决方案:

if(window.event){
oEvent = window.event; //处理兼容性,获得事件对象
//设置IE的charCode值
oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0; //解决方案
}
var oTarget;
if(oEvent.srcElement) //处理兼容性,获取事件目标
oTarget = oEvent.srcElement;
else
oTarget = oEvent.target;

oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;

理解:由于IE浏览器没有charcode,而keyCode只有在keydown、keyup事件发生时才与标准的DOM的keyCode相同,

在IE浏览器在keypress事件发生时,keycode的返回值是按键的Unicode值,而标准的DOM返回的是按键的数字代码,

通过三目运算符为IE浏览器设置charcode属性, 返回按键的Unicode值, 做到了与标准的DOM的charcode的属性一致

charcode keycode(keypress) keycode(keydown、keyup)

IE 无 按键的Unicode值(区分大小写) 按键的数字代码(不区分大小写)

标准DOM 按键的Unicode值 按键的数字代码 按键的数字代码

使用以下代码后:oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0; (注意:此语句是放在事件处理函数内)

charcode keycode(keypress) keycode(keydown、keyup)

IE 按键的Unicode值 按键的Unicode值 按键的数字代码

标准DOM 按键的Unicode值 按键的数字代码 按键的数字代码

<html>
<head>
<title>键盘事件</title>
<script language="javascript">
function handle(oEvent){
if(window.event){
oEvent = window.event; //处理兼容性,获得事件对象
//设置IE的charCode值
oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
}
var oDiv = document.getElementById("display");
//输出测试
oDiv.innerHTML += oEvent.type + ": charCode:" + oEvent.charCode + " keyCode:" + oEvent.keyCode + "<br>";
}
window.onload = function(){
var oTextArea = document.getElementsByTagName("textarea")[0];
oTextArea.onkeypress = handle;
oTextArea.onkeydown = handle;
}
</script>
</head>
<body>
<textarea rows="4" cols="50"></textarea>
<div id="display"></div>
</body>
</html>

输入字母aA

在IE浏览器测试结果:

keydown: charCode:0 keyCode:65 //按下字母a键

keypress: charCode:97 keyCode:97 //按下字母a键

keydown: charCode:0 keyCode:20 //按下大小写键caps lock

keydown: charCode:0 keyCode:65 //按下字母A键

keypress: charCode:65 keyCode:65 //按下字母A键

在火狐浏览器测试的结果

keydown: charCode:0 keyCode:65 //按下字母a键

keypress: charCode:97 keyCode:0 //按下字母a键

keydown: charCode:0 keyCode:20 //按下大小写键caps lock

keydown: charCode:0 keyCode:65 //按下字母A键

keypress: charCode:65 keyCode:0 //按下字母A键

归纳总结:

在keydown/keyup事件下,使用keycode属性(按键的数字代码)能兼容所有的浏览器

if(window.event){

oEvent = window.event; //处理兼容性,获得事件对象

//设置IE的charCode值

oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;

}

使用以上代码:

在keypress事件下, 使用charCode属性(获取按键的Unicode值,区分大小写)能兼容所有的浏览器, 也能区分大小写

Tags:

最近发表
标签列表