键盘控制事件应用教程大全


Posted in Javascript onNovember 24, 2006

获取键盘控制事件是实现交互性最有力的方法之一。 

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

 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 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
JavaScript栏目列表隐藏/显示简单实现
Apr 03 Javascript
Js,alert出现乱码问题的解决方法
Jun 19 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 Javascript
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
jQuery实现平滑滚动到指定锚点的方法
Mar 20 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
Apr 19 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
es6数据变更同步到视图层的方法
Mar 04 Javascript
vue遍历生成的输入框 绑定及修改值示例
Oct 30 Javascript
JS this关键字在ajax中使用出现问题解决方案
Jul 17 Javascript
Javascript操纵Cookie实现购物车程序
Nov 23 #Javascript
删除重复数据的算法
Nov 23 #Javascript
在JavaScript中实现命名空间
Nov 23 #Javascript
js变量作用域及可访问性的探讨
Nov 23 #Javascript
bcastr2.0 通用的图片浏览器
Nov 22 #Javascript
一种JavaScript的设计模式
Nov 22 #Javascript
表单内同名元素的控制
Nov 22 #Javascript
You might like
sphinx增量索引的一个问题
2011/06/14 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
JavaScript如何操作css
2020/10/24 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python读取二进制mnist实例详解
2017/05/31 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
公司任命书模板
2014/06/06 职场文书
志愿者活动总结报告
2014/06/27 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书