监听键盘鼠标事件

监听某个按键事件

当键盘上的某个键被按下时,会依次触发一次下面的事件:

  • onkeydown: 键盘按下这个动作(按下键盘)
  • onkeypress: 键盘被按住(一直按着键盘不动)
  • onkeyup: 键盘被弹起(松开键盘)

通过监听keydown事件既可以知道键盘被按下:

document.onkeydown = function(event) { // 键盘按下时触发 console.log('key down'); }; document.onkeypress = function(event) { // 键盘按住时触发 console.log('key press'); }; document.onkeyup = function (event) { // 键盘弹起时触发 console.log('key up'); }; // 控制台数据的顺序为:key down -> key press -> key up

注意到键盘按下的event参数,该参数为KeyboardEvent事件对象,其中包含按键相关的一些属性。其中:

  • type: 事件类型,如'keydown'或者'keyup'
  • key: 表示按下的键盘内容是什么即键值,按下字母'p'时,值为'p'
  • code: 表示键盘代码,按下字母'p'时,值为'KeyP'
  • keyCode(过时): 整数,表示键码,每个键都有唯一的键码,字母'p'的键码为80
  • altKey: 布尔值,表示此时的alt键是否也按下
  • ctrKey: 布尔值,表示此时的alt键是否也按下
  • shiftKey: 布尔值,表示此时的shift键是否也按下
  • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下
  • repeat: 布尔值,如果一个键一直被按着,则其值为true,表示重复

可以通过检查这些属性来判断用户按下的是什么键,以及是否ctrl和alt等键是否同时按下。

document.onkeydown = function(event) { // 键盘按下是触发 console.log('key down: ' + event.key); if (event.altKey) { console.log('alt is active'); } if (event.shiftKey) { console.log('shift is active'); } };

监听鼠标事件

相应的也可以监听鼠标相关的事件,触发时的参数eventMouseEvent对象类型:

  • onclick: 鼠标点击事件
  • ondblclick: 鼠标双击事件
  • onmousedown: 鼠标上的按钮被按下了
  • onmouseup: 鼠标按下后松开时触发的事件
  • onmousemove: 鼠标移动时触发的事件
  • onmouseout: 鼠标离开监听该事件的元素或子元素时触发的事件
  • onmouseover: 鼠标移动到监听该事件的元素或子元素时触发的事件
  • onmousewheel: 鼠标滚轮事件,一般使用onscroll事件

MouseEvent对象中包含下面比较有用的属性:

  • type: 事件类型,如'mosemove'或者'mousedown'
  • button: 整型,触发鼠标事件时按下的按钮编号
  • buttons: 整型,触发鼠标事件时弹起来的按钮编号
  • clientX: 鼠标指针在DOM内容区的X坐标
  • clientY:鼠标指针在DOM内容区的Y坐标
  • offsetX: 鼠标指针相对父节点填充边缘的X坐标
  • offsetY: 鼠标指针相对父节点填充边缘的Y坐标
  • screenX: 鼠标指针在全局屏幕的X坐标
  • screenY: 鼠标指针在全局屏幕的Y坐标
  • pageX: 鼠标指针在整个DOM内容(包括分页)的X坐标
  • pageY: 鼠标指针在整个DOM内容(包括分页)的Y坐标
  • altKey: 布尔值,表示此时的alt键是否也按下
  • ctrKey: 布尔值,表示此时的alt键是否也按下
  • shiftKey: 布尔值,表示此时的shift键是否也按下
  • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下

通过鼠标事件的event属性,可以获取鼠标点击的位置,这里有对各种坐标的相关介绍,鼠标点击时是否按住ctrl等。

监听连续的按键事件实现秘笈开启

在很多游戏中,都有隐藏的秘笈,比如上上下下左左右右BABA这样的秘笈,那么怎么在网页监听事件,能够知道用户是按下了这个秘笈呢?(才不是要在隐藏什么奇怪的东西才用这个的>_<)演示地址(输入秘笈真的有惊喜!):http://asset.uusama.com/example/keycode.html

实现的方法就是用一个数组来记录连续按键的状态,每次按键正确则匹配下一个,直到所有匹配成功,看下面代码:

// 上上下下左左右右BABA的键值
const secretKey = ['up', 'up', 'down', 'down', 'left', 'left', 'right', 'right', 'b', 'a', 'b', 'a']; // 秘笈的键码 const secretKeyCode = [38, 38, 40, 40, 37, 37, 39, 39, 66, 65, 66, 65]; // 当前按键匹配的状态 let secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0); // 当前正确秘笈按键的索引 // let correctCodeIndex = 0; const CORRECT_STATUS = 1; // 表示正确匹配按键的状态 document.onkeydown = function(event) { // 查找第一个0的位置,即当前按键应该匹配的位置 let correctCodeIndex = secretKeyCodeStatus.lastIndexOf(CORRECT_STATUS); correctCodeIndex = correctCodeIndex === -1 ? 0 : correctCodeIndex + 1; // 如果所有的按键都正确,则返回 if (correctCodeIndex > secretKeyCode.length) { alert('你成功打开了秘笈!通往哲♂学♂之路啊,我命令你开启吧!'); return true; } // 如果本次按键正确,则记录 if (event.keyCode === secretKeyCode[correctCodeIndex]) { console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' --correct,index:' + correctCodeIndex); // 所有按键都正确则成功 if (correctCodeIndex + 1 === secretKeyCodeStatus.length) { alert('你成功打开了秘笈!通往哲♂学♂之路啊,我命令你开启吧!'); // 重置状态 secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0); return true; } else { // 否则记录当前按键成功 secretKeyCodeStatus[correctCodeIndex] = CORRECT_STATUS; } } else { console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' --reset'); // 按键错误则重置 secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0); } };

模拟键盘和鼠标事件

上面我们说明了如何监听页面的按键和键盘事件,但是有的时候我们需要使用代码模拟按钮操作。

比如看到很多图片的时候,我们需要批量下载,这个时候可以打开控制台,写一段JS代码批量模拟下载步骤即可,而不用一个一个的手动点击,非常方便。

模拟鼠标点击

最简单的就是模拟点击了,我们只需要选中一个元素,然后执行click函数即可。

下面的代码实现在一个表格中,点击每一个图片。

const images = document.getElementById('content').getElementsByTagName('img'); for (let image of images) { images.click(); }

如果要模拟鼠标双击,或者鼠标移动,则没有简单的函数可以调用。这个时候我们需要新建一个MouseEvent对象,并手动触发即可。

创建MouseEvent对象的语法为:const event = new MouseEvent(typeArg, mouseEventInit);

  • typeArg为鼠标事件类型,即上面的监听鼠标事件去掉on后的字符串,

    • click: 鼠标点击事件
    • dblclick: 鼠标双击事件
    • mousedown: 鼠标上的按钮被按下了
    • mouseup: 鼠标按下后松开时触发的事件
    • mousemove: 鼠标移动时触发的事件
    • mouseout: 鼠标离开监听该事件的元素或子元素时触发的事件
    • mouseover: 鼠标移动到监听该事件的元素或子元素时触发的事件
  • mouseEventInitMouseEvent初始化的选项,指定鼠标事件的各种属性,可选值如下:
    • button: 整型,触发鼠标事件时按下的按钮编号
    • buttons: 整型,触发鼠标事件时弹起来的按钮编号
    • clientX: 鼠标指针在DOM内容区的X坐标
    • clientY:鼠标指针在DOM内容区的Y坐标
    • offsetX: 鼠标指针相对父节点填充边缘的X坐标
    • offsetY: 鼠标指针相对父节点填充边缘的Y坐标
    • screenX: 鼠标指针在全局屏幕的X坐标
    • screenY: 鼠标指针在全局屏幕的Y坐标
    • pageX: 鼠标指针在整个DOM内容(包括分页)的X坐标
    • pageY: 鼠标指针在整个DOM内容(包括分页)的Y坐标
    • altKey: 布尔值,表示此时的alt键是否也按下
    • ctrKey: 布尔值,表示此时的alt键是否也按下
    • shiftKey: 布尔值,表示此时的shift键是否也按下
    • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下

比如下面的示例在坐标200,200处触发一个鼠标双击事件:

// 创建一个event对象
const createEvent = new MouseEvent('dblclick', { clientX: 300, clientY: 300, }); // 触发该事件 document.dispatchEvent(createEvent);

可以使用任意的Document对象的dispatchEvent方法触发一个事件,这些触发的事件和实际发生的事件一模一样。

模拟键盘输入事件

和模拟鼠标事件一样,不过这儿我们要创建一个KeyboardEvent事件对象。

创建KeyboardEvent对象的语法类似为:const event = new KeyboardEvent(typeArg, KeyboardEventInit);

  • typeArg为键盘输入事件类型,即上面的监听键盘输入事件去掉on后的字符串,

    • keydown: 键盘按下这个动作
    • keypress: 键盘被按住
    • keyup: 键盘被弹起
  • KeyboardEventInitKeyboardEvent初始化的选项,指定键盘输入事件的各种属性,可选值如下:
    • type: 事件类型,如'keydown'或者'keyup'
    • key: 表示按下的键盘内容是什么即键值,按下字母'p'时,值为'p'
    • code: 表示键盘代码,按下字母'p'时,值为'KeyP'
    • keyCode(过时): 整数,表示键码,每个键都有唯一的键码,字母'p'的键码为80
    • altKey: 布尔值,表示此时的alt键是否也按下
    • ctrKey: 布尔值,表示此时的alt键是否也按下
    • shiftKey: 布尔值,表示此时的shift键是否也按下
    • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下
    • repeat: 布尔值,如果一个键一直被按着,则其值为true,表示重复

比如实现在按下字母'a'键时,自动按下'alt+ctrl+a'可以像下面实现。

// 监听按键事件
document.onkeydown = function(event) { console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' alt:' + event.altKey); if (event.keyCode === 65 || event.code === 'KeyA') { // 如果按下的是a键,则新建一个a键按下的事件并触发 const createEvent = new KeyboardEvent('keydown', { altKey: true, shiftKey: true, keyCode: 65, code: 'KeyA' }); document.dispatchEvent(createEvent); } };

然后你就会发现上面的函数疯狂的输出A键被按下,哈哈哈!知道内存达到限制!

附录

最后附上键值和键码的对应关系对象,可以直接拷贝使用:

const keyCodes = {0: 'That key has no keycode',3: 'break', 8: 'backspace / delete', 9: 'tab', 12: 'clear', 13: 'enter', 16: 'shift', 17: 'ctrl', 18: 'alt', 19: 'pause/break', 20: 'caps lock', 21: 'hangul', 25: 'hanja', 27: 'escape', 28: 'conversion', 29: 'non-conversion', 32: 'spacebar', 33: 'page up', 34: 'page down', 35: 'end', 36: 'home', 37: 'left arrow', 38: 'up arrow', 39: 'right arrow', 40: 'down arrow', 41: 'select', 42: 'print', 43: 'execute', 44: 'Print Screen', 45: 'insert', 46: 'delete', 47: 'help', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9', 58: ':', 59: 'semicolon (firefox), equals', 60: '<', 61: 'equals (firefox)', 63: 'ß', 64: '@ (firefox)', 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 91: 'Windows Key / Left ⌘ / Chromebook Search key', 92: 'right window key', 93: 'Windows Menu / Right ⌘', 95: 'sleep', 96: 'numpad 0', 97: 'numpad 1', 98: 'numpad 2', 99: 'numpad 3', 100: 'numpad 4', 101: 'numpad 5', 102: 'numpad 6', 103: 'numpad 7', 104: 'numpad 8', 105: 'numpad 9', 106: 'multiply', 107: 'add', 108: 'numpad period (firefox)', 109: 'subtract', 110: 'decimal point', 111: 'divide', 112: 'f1', 113: 'f2', 114: 'f3', 115: 'f4', 116: 'f5', 117: 'f6', 118: 'f7', 119: 'f8', 120: 'f9', 121: 'f10', 122: 'f11', 123: 'f12', 124: 'f13', 125: 'f14', 126: 'f15', 127: 'f16', 128: 'f17', 129: 'f18', 130: 'f19', 131: 'f20', 132: 'f21', 133: 'f22', 134: 'f23', 135: 'f24', 144: 'num lock', 145: 'scroll lock', 160: '^', 161: '!', 162: '؛ (arabic semicolon)', 163: 

转载于:https://www.cnblogs.com/learn1015/p/10381671.html

JavaScript键盘鼠标事件处理相关推荐

  1. 20个优秀的JavaScript 键盘事件处理库

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  2. JavaScript 键盘事件处理

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  3. JavaScript教程之事件处理

    1.什么是事件 通过鼠标.键盘对浏览器页面所做的动作就是事件. 事件一旦发生需要有事件处理,该处理称为"事件驱动",事件驱动通常由函数担任 onclick:鼠标点击 onmouse ...

  4. 【转】理解JavaScript中的事件处理

    这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时之需. 转载地址:http://www.cnblogs.com/binyong/articles/1750263.h ...

  5. JavaScript 事件模型 事件处理机制

    这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时之需. 什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们 ...

  6. DataGrid鼠标事件处理

    http://blog.csdn.net/bgu/ 完成功能是DataGrid的页面选中事件.鼠标事件.双击事件改变TR的色彩.代码很简单,只是一点JS操作. JS文件:GridControl.js ...

  7. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 游戏修改器制作教程一:键盘鼠标模拟

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  9. JavaScript键盘事件常见用法实例分析

    JavaScript 键盘事件有以下3种 keydown 键盘按键按下(如果按着不放,会持续触发该事件),可以捕获组合键. keypress 键盘非功能按键按下(在keydown之后触发,如果按着不放 ...

  10. Cesium 键盘鼠标控制相机漫游(源码+原理讲解)

    Cesium 键盘鼠标控制相机漫游(源码+原理讲解) 在各大博客平台上,Cesium使用键盘控制相机漫游的源码已经有不少人贴出源码,本人在浏览这些源码的过程中发现大家采用的方式基本一致,大部分代码都是 ...

最新文章

  1. python做图像识别好还是c++好_OpenCV人脸检测(C++/Python)
  2. 论文笔记:ZFNet
  3. vue 后台翻译_vue translate peoject实现在线翻译功能【新手必看】
  4. window.onload和3的小游戏
  5. socket编程(一)最简单的c/s模式
  6. 短视频自媒体成功的秘诀就一个字:真
  7. Android 开发中eclipse 下 DDMS 视图中 sdcard 中文件导入的处理
  8. 《视觉SLAM十四讲》学习笔记
  9. iVX开发过程整理的常见问题与回答(二)
  10. 【CG物理模拟系列】开篇:介绍(下)
  11. Windows环境下filebeat配置发送日志至Elasticsearch
  12. lnux php 连接access,在Linux下实现对Microsoft Access Database(.mdb
  13. IEC61850开发,smv9-1测试工具
  14. MAX485串口通信
  15. 传智商城php,传智播客ThinkPHP开发大型商城项目实战视频教程
  16. 局域网oracle无法访问,oracle11g本地可以访问但局域网无法访问
  17. 要实现秒杀还得看这个高并发系统架构的表演
  18. 北大“人工智能前沿与产业趋势”课程整理
  19. 天翼云应用实操-天翼云资源池间通过IPSEC实现高速互通
  20. LVGL---对象(lv_obj_t)

热门文章

  1. Windows10系统无法更改默认浏览器等默认设置
  2. 反向延长线段什么意思_反向延长线是什么意思
  3. 《数学之美》 读书笔记
  4. 使人疲惫的不是远方的高山,而是你鞋子里的一粒沙子
  5. 当我在浏览器输入 www.baiu.com 之后发生了什么
  6. excel 行列互换 绿色工具(怎么把行变成列,把列变成行)
  7. 4G LTE是什么意思
  8. 版权符号©的输入方法
  9. Android 长按Menu键的监听
  10. 双绞线与计算机连接的接口是,rj45网络双绞线4根线接法详解