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 相关文章推荐
Knockout text绑定DOM的使用方法
Nov 15 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
Jan 28 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
关于vue-resource报错450的解决方案
Jul 24 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
3分钟读懂移动端rem使用方法(推荐)
May 06 Javascript
javascript实现商品图片放大镜
Nov 28 Javascript
Vue和React有哪些区别
Sep 12 Javascript
关于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图片上传程序
2008/03/27 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
jQuery中empty()方法用法实例
2015/01/16 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
django云端留言板实例详解
2019/07/22 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
校园安全广播稿
2014/02/08 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
弄虚作假心得体会
2014/09/10 职场文书
复试通知单模板
2015/04/24 职场文书
礼貌问候语大全
2015/11/10 职场文书
python实现过滤敏感词
2021/05/08 Python
MySQL分布式恢复进阶
2022/07/23 MySQL