惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
S
Schneier on Security
P
Proofpoint News Feed
The Cloudflare Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园 - 【当耐特】
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
F
Fortinet All Blogs
宝玉的分享
宝玉的分享
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
G
GRAHAM CLULEY
T
Threatpost
T
Threat Research - Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
SecWiki News
SecWiki News
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Last Watchdog
The Last Watchdog
阮一峰的网络日志
阮一峰的网络日志
Security Latest
Security Latest
P
Palo Alto Networks Blog
L
LINUX DO - 最新话题
博客园 - 司徒正美
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy International News Feed
N
News and Events Feed by Topic
Spread Privacy
Spread Privacy
T
Tenable Blog
有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
AI
AI

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
告别JS keyCode « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2021-01-04 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=9755
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

键盘素材占位图封面

一、为什么keyCode不推荐使用了?

对于这个问题的答案,说实话,我找了很多资料,并没有特别明确的回答。

早些年,我得到的说法是,用户可能会自定义键盘,导致keyCode不准。

但是,这次搜寻资料,没有见到类似的说法。

MDN上的解释是对打印字符不友好。

我琢磨着可能是这几个意思:

1. 不同字符共用keyCode

键盘上有很多按键是同时对应两个字符的,例如“<,”和“>.”就在一个键上,数字键那里(1!、2@、3#、4$、5%、……)都是一个键对应多个字符,如果想要输入两位字符,往往需要按住Shift键才行,例如字符“<>!@#$%^&*()……”等字符的输入。

keyCode值是跟着键盘走的,而不是字符内容,也就是,当我们输入“<,”和“>.”等字符的时候,返回的keyCode值是一样的,我们需要通过判断用户是否按下了Shift键才知道究竟输入的是哪个字符。

这就很啰嗦。

例如:

window.addEventListener('keydown', function (event) {
  console.log(event.keyCode);
});

然后在页面中分别输入字符“.>”,则会看到输出的keyCode值都是一样的190,如下截图所示:

keyCode都是190示意

明明是两个不同的字符,结果输出的keyCode值是一样的,对开发就不友好。

2. 相同按键不同keyCode

例如全键盘中的数字键按住Shift键可以输出其他内容,例如下图所示的数字键盘。

数字键盘

例如右下角的小数点字符'.'同时有Del键的能力。

此时,按下此键和Shift+按下此键的keyCode值是不一样的。

同一按键不同keyCode值

然后大家就会发现按下'.'返回的keyCode是110,加了个Shift键之后返回的就变成了46了。

这就蛋疼了,因为上面同样按键返回同样keyCode,这里居然摇身一变,相同按键返回了不同的keyCode。

3. 相同字符不同keyCode

还没完,Shift+'.'返回keyCode就是直接按下delete键的keyCode值,给人感觉只要最终行为或字符输出是一样的,keyCode值也应该是一样的,实际上,并不是这样的。

即使输入同一字符,也可能会是不同的keyCode值。

这里大家注意力放在下图中右上方的加号和减号上。

同一按键不同keyCode值

同时,上方的一排数字键那里也是有加号和减号的,如下图所示:

加号和减号code值对比示意

此时,分别按下这两个键,会发现输出的字符是一模一样的,但是keyCode值却是不同的,如下截图示意。

短横线和减号不同字符

上方数字键那里的短横线连字符的keyCode是189,而数字键盘那里的减号字符的keyCode是109,实际上这两个字符一模一样。

试想下,如果开发过程中判断用户是否按下的是连字符,使用keyCode判断,是不是很容易出bug?

其他的几个数字可有类似的问题,例如数字键盘输出的1-9的keyCode和键盘上面1-9数字的keyCode值是不一样的。

4. 中文输入法下标点符号keyCode都是一样的

例如输入框中是中文输入法,此时,“,。;‘【】-=”这些字符的keyCode全部都返回229,根本就没法继续玩了。

中文输入法均返回keyCode 229

补充于2023-02-08

最近发现,中文输入法开启时候keyCode值是229还是有用的。

当我们希望监听输入框是否按下Enter键触发submit行为的时候,使用event.keyCode 可以避免输入法回车(使用英文)不小心触发submit事件的问题。

如果使用event.code或event.key,无论输入法是否开启,返回的都是 ‘Enter’,就会导致中文输入场景下,内容还没写入就被提交的情况出现。


或许是因为上面指出的4个keyCode对打印字符不友好的地方,keyCode才不推荐使用,目前规范推荐使用event.code或event.key。

//zxx: 如果你看到这段文字,说明你现在访问是体验糟糕的垃圾盗版网站,你可以访问原文获得很好的体验:https://www.zhangxinxu.com/wordpress/?p=9755(作者张鑫旭)

二、event.code和event.key的区别

event.code指明按下的是具体哪个物理键,键盘上每一个按键都对应一个唯一的event.code值,均使用大写英文单词表示。

event.key指明具体输入的字符内容,如果是非打印字符(例如Enter键、Esc键、Shift键、Alt键等),则返回具体的非打印字符的英文名称,如果输入内容与输入法有关则返回固定的Process名称。

为了方便大家快速了解差异,我选取了几个具有代表性的按键,整理了个表格,显示了不同按键下event.codeevent.key的值。

keyCode值 code值 key值 描述
49 ‘Digit1’ ‘1’ 上方数字键1按下
97 ‘Numpad1’ ‘1’ 小键盘数字键1按下
16 ‘ShiftLeft’ ‘Shift’ 左侧的Shift键
16 ‘ShiftRight’ ‘Shift’ 右侧的Shift键
190 ‘Period’ ‘.’ 主键盘中的点符号
110 ‘NumpadDecimal’ ‘.’ 数字键盘中的小数点符号
229 ‘Period’ ‘Process’ 中文输入法下主键盘中的点符号
229 ‘Minus’ ‘Process’ 中文输入法下主键盘中的’-‘符号
189 ‘Minus’ ‘-‘ 主键盘中的’-‘符号
109 ‘NumpadSubtract’ ‘-‘ 数字键盘中的’-‘符号

对于英文场景,只需要使用event.key就可以知道键盘输入的内容了。

但是如果是中文场景,情况就变得复杂的多。

在中文输入框开启的场景下,如果按键的内容和非中文输入法下的内容不一样,则event.key的返回值是固定的Process,表示输入的字符内容和键盘对应的原始内容进行了处理。

例如主键盘中的字符点默认情况下就是个.,但是如果是中文输入框,字符点就是句号,而键盘上完全就没有句号这个字符,说明字符点被输入法给处理了,因此返回的就是Process。

这就导致,在中文输入法场景下,用户或者开发者是无法知道按键应该输入的内容的。

即使配合event.code也不行。

有人可能会反驳,event.code返回’Period’,不就表明按下的是点号键,此时event.key是’Process’,不就可以判断输入的是句号了。

理论上可行,实操起来却比预想的麻烦,且不具有可复制性。

  • 麻烦在于,如果用户输入的是这个符号,也就是右书名号,event.code返回的也是’Period’,event.key也是’Process’。还需要开发者判断event.shiftKey是否为true,表示Shift键是否按下。

    以及,换个其他语言输入法,则按下’Period’键返回的就不一定是句号了。

  • 不具有可复制性在于,中文输入法经常会使用空格或者回车表示选中,此时,event.code是Space或者Enter,event.key的值是Process,根本无法判断到底输入的是什么。

所以,event.codeevent.key这两个不适合中文输入法下的输入判断。

好在,实际开发中,很少有场景需要提前知道用户是否开启了中文输入法。

更多的是一些功能键的判断。

例如空格、回车、删除、上下左右键、上一页下一页键,home/end键,ESC键等。

因此,接下来给大家罗列以下常见的功能键对应的event.keyevent.code值。

三、常见功能键key值

功能键key值更实用,因此放在前面展示。

详见下表:

按键名称 event.key keyCode值
回车 Enter 13
delete删除 Delete 46
backspace退格 Backspace 8
esc取消 Escape 27
tab索引 Tab 9
ArrowUp 38
ArrowDown 40
ArrowLeft 37
ArrowRight 39
pageDown下一页 PageDown 34
pageUp上一页 PageUp 33
home键 Home 36
end键 End 35
shift键 Shift 16
control键 Control 17
alt键 Alt 18

KeyboardEvent.key值兼容性要比KeyboardEvent.code值好一些,如下所示:

KeyboardEvent.key兼容性

IE浏览器勉强支持,返回的值可能和规范中定义的有出入。如果要兼容IE浏览器,兼容可以用keyCode属性撑一会儿。

四、常见功能键的code值

如下表所示,大部分返回值和key值是一样的,因为都是功能键,如果是可打印字符,则code值和key值那就完全是两码事了:

按键名称 event.code 说明
回车 Enter
delete删除 Delete Shift+NumpadDecimal也可能是删除
backspace退格 Backspace
esc取消 Escape
tab索引 Tab
ArrowUp 38
ArrowDown 40
ArrowLeft
ArrowRight
pageDown下一页 PageDown
pageUp上一页 PageUp
home键 Home
end键 End
shift键 ShiftLeft/ShiftRight
control键 ControlLeft/ControlRight
alt键 AltLeft/AltRight

兼容性如下截图所示:

KeyboardEvent.code兼容性

五、送你一朵小红花

除了event.keyCode不推荐使用,event.which也不推荐使用了,官方名称为KeyboardEvent.which。

虽然不推荐使用,但是按照我的理解,99%的概率浏览器还会一直保持支持的,因为要是去掉这几个API特性,这世界上至少几百万个网站开发者会炸开锅。

当然,如果条件允许(不用考虑IE浏览器),我们还是优先使用event.key或者event.code来识别按键。

另外,相比原来的event.keyCode或者eevent.whichevent.keyevent.code要更好上手,例如上下左右键的几个数字,我老是记不住,总有run一下看看值是多少,但是如果是event.key,则直接使用语义化的英文单词即可。

只需要记住单词规则,首字母大小,每个分词首字母大写就OK了。

OK,以上就是本文全部内容,加深了下我自己对键盘事件的一些了解,整理了几个常用功能键表格,这个回头开发我会用到。MDN上的表格实在是冗长,不适合实战中使用。

这篇文章估计分享的人不会很多。

不管怎样,依然送你一朵小红花,感谢您的阅读与支持!

本文为原创文章,欢迎分享,勿全文转载,如果实在喜欢,可收藏,永不过期,且会及时更新知识点及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=9755

(本篇完)