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下判断一个元素是否存在的代码
Mar 05 Javascript
关于可运行代码无法正常执行的使用说明
May 13 Javascript
javascript的console.log()用法小结
May 31 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
JS计算网页停留时间代码
Apr 28 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
html5+canvas实现支持触屏的签名插件教程
May 08 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 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
第三节 定义一个类 [3]
2006/10/09 PHP
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
原生js编写焦点图效果
2016/12/08 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python dict如何定义
2020/09/02 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
运动会稿件100字
2014/02/21 职场文书
化学专业自荐信
2014/05/28 职场文书
研究生求职自荐书
2014/06/23 职场文书
爱护公物演讲稿
2014/09/09 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
《颐和园》教学反思
2016/02/19 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
python单元测试之pytest的使用
2021/06/07 Python