在 JavaScript 中,当用户操作键盘时,会触发键盘事件,键盘事件主要包括下面 3 种类型:

keydown:在键盘上按下某个键时触发。如果按住某个键,会不断触发该事件,但是 Opera 浏览器不支持这种连续操作。该事件处理函数返回 false 时,会取消默认的动作(如输入的键盘字符,在 IE 和 Safari 浏览器下还会禁止keypress 事件响应)。

keypress:按下某个键盘键并释放时触发。如果按住某个键,会不断触发该事件。该事件处理函数返回 false 时,会取消默认的动作(如输入的键盘字符)。

keyup:释放某个键盘键时触发。该事件仅在松开键盘时触发一次,不是一个持续的响应状态。

当获取用户正按下键码时,可以使用 keydown、keypress 和 keyup 事件获取这些信息。其中 keydown 和 keypress 事件基本上是同义事件,它们的表现也完全一致,不过一些浏览器不允许使用 keypress 事件获取按键信息。所有元素都支持键盘事件,但键盘事件多被应用在表单输入中。

示例

下面示例实时捕获键盘操作的各种细节,即键盘响应事件类型及对应的键值。

var key = document.getElementById("key");

key.onkeydown =f; //注册keydown事件处理函数

key.onkeyup = f; //注册keyup事件处理函数

key.onkeypress = f; //注册keypress事件处理函数

function f (e) {

var e = e || window.event; //标准化事件处理

var s = e.type + " " + e.keyCode; //获取键盘事件类型和按下的值

key.value = s;

}

键盘事件属性

键盘定义了很多属性,如下表所示。利用这些属性可以精确控制键盘操作。键盘事件属性一般只在键盘相关事件发生时才会存在于事件对象中,但是 ctrlKey 和 shiftKey 属性除外,因为它们可以在水保事件中存在。例如,当按下 Ctrl 或Shift 键时单击鼠标操作。

键盘事件定义的属性

属性

说明

keyCode

该属性包含键盘中对应键位的键值

charCode

该属性包含键盘中对应键位的 Unicode 编码,仅 DOM 支持

target

发生事件的节点(包含元素),仅 DOM 支持

srcElement

发生事件的元素,仅 IE 支持

shiftKey

是否按下 Shift 键,如果按下返回 true,否则为false

ctrlKey

是否按下 Ctrl 键,如果按下返回 true,否则为false

altKey

是否按下 Alt 键,如果按下返回 true,否则为false

metaKey

是否按下 Mtea 键,如果按下返回 true,否则为false,仅 DOM 支持

示例1

ctrlKey 和 shiftKey 属性可存在于键盘和鼠标事件中,表示键盘上的 Ctrl 和 Shift 键是否被按住。下面示例能够监测 Ctrl 和 Shift 键是否被同时按下。如果同时按下,且鼠标单击某个页面元素,则会把该元素从页面中删除。

document.onclick = function (e) {

var e = e || window.event; //标准化事件对象

var t = e.target || e.srcElement; //获取发生事件的元素,兼容IE和DOM

if (e.ctrlKey && e.shiftKey) { //如果同时按下Ctrl和Shift键

t.parentNode.removeChild(t); //移出当前元素

}

}

keyCode 和 charCode 属性使用比较复杂,但是它们在实际开发中又比较常用,故比较这两个属性在不同事件类型和不同浏览器中的表现时非常必要的,如下表所示。读者可以根据需要有针对性的选用事件响应类型和引用属性值。

keyCode 和 charCode 属性值

属性

IE 事件模型

DOM 事件模型

keyCode(keypress)

返回所有字符键的正确值,区分大写状态(65~90)和小写状态(97~122)

功能键返回正确值,而 Shift、Ctrl、Alt、PrintScreen、ScrollLock 无返回值,其他所有键值都返回 0

keyCode(keydown)

返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90)

返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90)

keyCode(keyup)

返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90)

返回所有键值(除 PrintScreen 键),字母键都以大写状态显示键值(65~90)

charCode(keypress)

不支持该属性

返回字符键,区分大写状态(65~90)和小写状态(97~122),Shift、Ctrl、Alt、PrintScreen、ScrollLock 无返回值,其他所有键值都返回 0

charCode(keydown)

不支持该属性

所有键值为 0

charCode(keyup)

不支持该属性

所有键值为 0

某些键的可用性不是很正确,如 PageUp 和 Home 键等。不过常用功能键和字符键都是比较稳定的,如下表所示。

键位和码值对照表

键位

码值

键位

码值

0~9(数字键)

48~57

A~Z(字母键)

65~90

Backspace(退格键)

8

Tab(制表键)

9

Enter(回车键)

13

Space(空格键)

32

Left arrow(左箭头键)

37

Top arrow(上箭头键)

38

Right arrow(右箭头键)

39

Down arrow(下箭头键)

40

示例2

下面示例演示了如何使用方向键控制页面元素的移动效果。

var box = document.getElementById("box"); // 获取页面元素的引用指针

box.style.position = "absolute"; // 色块绝对定位

box.style.width = "20px"; // 色块宽度

box.style.height = "20px"; // 色块高度

box.style.backgroundColor = "red"; // 色块背景

document.onkeydown = keyDown;

//在Document对象中注册keyDown事件处理函数

function keyDown(event){ // 方向键控制元素移动函数

var event = event || window.event; // 标准化事件对象

switch(event.keyCode){ // 获取当前按下键盘键的编码

case 37 : // 按下左箭头键,向左移动5个像素

box.style.left = box.offsetLeft - 5 + "px";

break;

case 39 : // 按下右箭头键,向右移动5个像素

box.style.left = box.offsetLeft + 5 + "px";

break;

case 38 : // 按下上箭头键,向上移动5个像素

box.style.top = box.offsetTop - 5 + "px";

break;

case 40 : // 按下下箭头键,向下移动5个像素

box.style.top = box.offsetTop + 5 + "px";

break;

}

return false

}

在上面示例中,首先获取页面元素,通过 CSS 脚本控制元素绝对定位、大小和背景色。然后在 document 对象上注册鼠标按下事件类型处理函数,在事件回调函数 keyDown() 中侦测当前按下的方向键,并决定定位元素在窗口中的位置。其中元素的 offsetLeft 和 offsetTop 属性可以存取它在页面中的位置。

键盘响应顺序

当按下键盘时,会连续触发多个事件,它们将按如下顺序发生。

对于字符键来说,键盘事件的响应顺序:keydown → keypress → keyup。

对于非字符键(如功能键或特殊键)来说,键盘事件的相应顺序:keydown → keyup。

如果按下字符键不放,则 keydown 和 keypress 事件将逐个持续发生,直至松开按键。

如果按下非字符键不放,则只有 keydown 事件持续发生,直至松开按键。

示例

下面设计一个简单示例,以获取键盘事件相应顺序。

var n = 1; // 定义编号变量

var text = document.getElementById("text"); // 获取文本区域的引用指针

text.onkeydown = f; // 注册keydown事件处理函数

text.onkeyup = f; // 注册keyup事件处理函数

text.onkeypress = f; // 注册keypress事件处理函数

function f(e){ // 事件调用函数

var e = e || window.event; // 标准化事件对象

text.value += (n++) + "=" + e.type +" (keyCode=" + e.keyCode + ")\n";

//捕获事件响应信息

}

演示效果如下:

当分别输入 A、B、C 时:

当分别输入 Shift、Ctrl、Alt 功能键时:

当连续按下字符 A 时:

当连续按下 Shift 键时:

js取消键盘监听_JS键盘事件(非常详细)相关推荐

  1. java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动

    package plane; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; im ...

  2. js下载文件 监听下载完成事件

    <script src="xxx/layui/layui.js"></script> <script src="xxx/jquery.min ...

  3. Vue.js 之 组件-监听子组件事件

    1.监听子组件事件 前面介绍了父组件如何通过 prop 向子组件传递数据,反过来,子组件如何向父组件通信呢? 在 Vue.js 中,这是通过自定义事件来实现的,子组件使用 $emit() 方法触发事件 ...

  4. Java_基础—GUI(窗体/鼠标/键盘/动作监听和键盘事件)

    一.窗体监听 Frame f = new Frame("我的窗体"); //事件源是窗体,把监听器注册到事件源上 //事件对象传递给监听器 package com.soar.gui ...

  5. element-ui 搜索框组件:监听input键盘事件 - 代码篇

    踩坑:vue + element-ui 框架监听input键盘事件 - 含demo演示 代码示下: html部分: <el-inputplaceholder="职位 | 地区 | 工作 ...

  6. uni-app监听窗口尺寸变化事件和隐藏键盘

    文章目录 监听窗口尺寸变化 uni.onWindowResize(CALLBACK) uni.offWindowResize(CALLBACK) 隐藏软键盘 uni.hideKeyboard() un ...

  7. C#全局监听Windows键盘事件

    本方法只涉及到如何应用现有工具类实现监听,其具体的原理主要涉及到调用Windows底层API:定义一个钩子钩住键盘事件,在这里不讲具体原理. 1.工具类代码 引用 using System; usin ...

  8. Android 类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现

    最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现. 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录.在EditText里输入要搜索的关键字 ...

  9. Java中使用JNA实现全局监听Linux键盘事件

    title: Java中使用JNA实现全局监听Linux键盘事件 date: 2019-05-03 19:08:00 Java中使用JNA实现全局监听Linux键盘事件 用JNA实现的键盘监听,在Wi ...

最新文章

  1. PHP shell模式下执行PHP文件报错
  2. Spring 建立简单的示例
  3. JS 活学活用正则表达式
  4. 如何将瀑布流里的图片加链接_只需5步!魔幻丛林瀑布后期揭秘
  5. sdn体系的三个平面_十张图看懂SDN与NFV的区别与联系?
  6. 买卖股票的最佳时机III
  7. linux引导时输入特殊信息的含义
  8. TypeScript 变量声明
  9. pandas 转化np数据_利用Python进行数据分析(语法篇)
  10. PHP上传大文件 分割文件上传
  11. 10BASE-2 是什么意思
  12. “梅丽莎”病毒背后的神秘黑客
  13. Android编译libjpeg-turbo so高效压缩图片
  14. Windows下功能强大注册表整理、修复软件RegClean Pro v6.21多国语言版
  15. Python与SEO,搜狗站长平台网站提交POST源码
  16. hihoCoder 1425 : What a Beautiful Lake(美丽滴湖)
  17. android圆形图片,圆形背景文字的CircleTextImageView开源组件
  18. 工作区子系统设计时,同时也要考虑终端设备的用电需求,下面关于信息插座与电源插座之间的间距描述中,哪一个是正确的呢?
  19. 【前端实例代码】霓虹灯按钮动画效果悬停2| html CSS特效 惊艳| 前端开发 网页制作 基础入门教程
  20. 高通骁龙845的android手机有哪些,骁龙845手机有哪些?高通骁龙845手机推荐

热门文章

  1. Git批量删除本地分支
  2. 无线充电宝有用吗?有没有好的无线充电宝推荐
  3. Java实现验证码验证功能
  4. 红米k30至尊版和红米k30s至尊版参数对比哪个更值得入手
  5. redis集群清除数据
  6. 捡了鼠标开网吧系列——nodejs爬取电影链接
  7. 网络攻击分类(五类)
  8. 详解MySQL联合索引
  9. Webpack系列——代码分离(Code Splitting)
  10. SpringCloud微服务(二)Fegin负载均衡