javascript的键盘控制事件说明


Posted in Javascript onApril 15, 2008

控制回车焦点问题:

<script type="text/javascript"> 
function submitForm() { 
if(window.event.keyCode==13) { 
document.getElementById('btnSearch').focus(); 
} 
} 
document.onkeydown=submitForm; 
</script>

首先需要了解的是如何初始化该事件,基本语句如下:

document.onkeydown = keyDown

当浏览器读到这个语句时,无论按下键盘上的哪个键,都将呼叫KeyDown()函数。

捕获键盘事件对于不同的浏览器来说有点困难,我们分别的来学习不同浏览器的实现语句。

Netscape

Netscape的程序实现要比IE麻烦,你必须放一个特别的语句,来使Netscape始终去检查击键事件,如果没有这行语句,击键事件将与按下鼠标事件搞混。特别语句如下:

document.onkeydown = keyDown
if (ns4) document.captureEvents(Event.KEYDOWN)

keyDown()函数有一个隐藏的变量--一般的,我们使用字母“e”来表示这个函数。

function keyDown(e)

变量e表示发生击键事件,寻找是哪个键被按下,使用以下属性:

e.which

这将给出该键的索引值,把索引值转化成该键的字母或数字值,写:

String.fromCharCode(e.which)

把上面的语句放在一起,我们可以知道被按下的是哪一个键:

function keyDown(e) { 

var keycode = e.which 

var realkey = String.fromCharCode(e.which) 

alert("keycode: " + keycode + " realkey: " + realkey) 
} 

 document.onkeydown = keyDown 
document.captureEvents(Event.KEYDOWN)

Internet Explorer

IE的程序与Netscape类似,但它不需要e变量,用window.event.keyCode来代替e.which,把键的索引值转化为真实键值方法类似:String.fromCharCode(event.keyCode),程序如下:

function keyDown() { 

 var keycode = event.keyCode 

 var realkey = String.fromCharCode(event.keyCode) 

 alert("keycode: " + keycode + " realkey: " + realkey) 
} 
document.onkeydown = keyDown 
document.onkeydown = keyDown

适用于两者的程序

用两种浏览器检查上述实例,你会发现执行结果不总是一样的,这是因为两种浏览器的键盘代码设置不相同,因此你必须使用单独的代码分别来写这段程序,而毫无别法。

建议你要完全忘掉实际的键值,仅仅使用键盘的代码值来工作。下面这段程序将视情况而设置,如果是用IE的话,ieKey生效,把nKey设为0,如果是用Netscape的话,nKey生效,把nKey设为0,然后用一个警示框来显示两者的值:

function keyDown(e) { 

if (ns4) { 

 var nKey=e.which; 

 var ieKey=0 

} 

if (ie4) { 

 var ieKey=event.keyCode; 

 var nKey=0 

} 

alert("nKey:"+nKey+" ieKey:" + ieKey) 
} 
document.onkeydown = keyDown 
if (ns4) document.captureEvents(Event.KEYDOWN)

使用键盘移动对象

下面的程序实现用键盘移动对象,程序将检查哪一个键被按下,从而调用相应的函数来移动对象。本例中,当字母“A”被按下时,对象就开始移动,字母“A”键在nKey中的值是97,ieKey的值为65,在程序中将分别检查这两个值。

function init() { 

if (ns4) block = document.blockDiv 

if (ie4) block = blockDiv.style 

block.xpos = parseInt(block.left) 

document.onkeydown = keyDown 

if (ns4) document.captureEvents(Event.KEYDOWN) 
} 
function keyDown(e) { 

if (ns4) { var nKey=e.which; var ieKey=0 } 

if (ie4) { var ieKey=event.keyCode; var nKey=0 } 

if (nKey==97 || ieKey==65) { // 如果"A"键按下 


slide() 

} 
} 
function slide() { 

block.xpos += 5 

block.left = block.xpos 

status = block.xpos // 这一句不一定需要,只是为了检查状态 

setTimeout("slide()",30) 
}

增加 "Active"变量

上面程序稍微有些不足,对象移动以后就无法使它停止了,而且当你多按几次A键时,物体将运动得越来越快,这里我们来修补它。

使用变量"active"来改变这种情况,插入if语句来检查函数是否重复。

function slide() { 

if (myobj.active) { 

myobj.xpos += 5 

myojb.left = myobj.xpos 

setTimeout("slide()",30) 

} 
}

在这种情况中,slide()函数只有在myobj.active值为真的时候才会工作,当myobj.active值为假时,对象将停止移动。

使用 onKeyUp 和 "Active" 变量

onkeyup事件和onkeydown事件工作原理相同,用以下语句初始化该事件:

document.onkeydown = keyDown 
document.onkeyup = keyUp 
if (ns4) document.captureEvents(Event.KEYDOWN | Event.KEYUP)

keyUp() 函数与之相同,当一个键被放开时事件被激发,对象停止移动,并将active变量置为0:

function keyUp(e) { 

if (ns4) var nKey = e.which 

if (ie4) var ieKey = window.event.keyCode 

if (nKey==97 || ieKey==65) 

block.active = false 
}

下面是比较完整的程序:

function init() { 

if (ns4) block = document.blockDiv 

if (ie4) block = blockDiv.style 

block.xpos = parseInt(block.left) 

block.active = false 

document.onkeydown = keyDown 

document.onkeyup = keyUp 

if (ns4) document.captureEvents(Event.KEYDOWN | Event.KEYUP) 
} 
function keyDown(e) { 

if (ns4) {var nKey=e.which; var ieKey=0} 

if (ie4) {var ieKey=event.keyCode; var nKey=0} 

if ((nKey==97 || ieKey==65) && !block.active) { // if "A" key is pressed 


block.active = true slide() 

} 
} 
function keyUp(e) { 

if (ns4) {var nKey=e.which; var ieKey=0} 

if (ie4) {var ieKey=event.keyCode; var nKey=0} 

if (nKey==97 || ieKey==65) { 

block.active = false // if "A" key is released 

} 
} 
function slide() { 

 if (block.active) { 


block.xpos += 5 


block.left = block.xpos 


status = block.xpos // not needed, just for show 


setTimeout("slide()",30) 

 } 
}
Javascript 相关文章推荐
Javascript里使用Dom操作Xml
Sep 20 Javascript
用js实现预览待上传的本地图片
Mar 15 Javascript
javascript静态页面传值的三种方法分享
Nov 12 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
Angular2 路由问题修复详解
Mar 01 Javascript
Vue自定义指令详解
Jul 28 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 Javascript
vue实现简易的双向数据绑定
Dec 29 Vue.js
关于document.cookie的使用javascript
Apr 11 #Javascript
javascript比较文档位置
Apr 08 #Javascript
js函数般调用正则
Apr 08 #Javascript
javascript背投广告代码的完善
Apr 08 #Javascript
大家未必知道的Js技巧收藏
Apr 07 #Javascript
用JavaScript调用WebService的示例
Apr 07 #Javascript
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 #Javascript
You might like
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
利用python循环创建多个文件的方法
2018/10/25 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
运动会跳远广播稿
2014/02/04 职场文书
迟到检讨书500字
2014/02/05 职场文书
优秀学生事迹材料
2014/02/08 职场文书
趣味运动会活动方案
2014/02/12 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
不错的求职信范文
2014/07/20 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL