键盘与文本事件

1、keydown

当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件。

是在文本框发生变化之前被触发的,keydown事件中拿不到当前按下的键的值。但是可以通过e.keyCode来获得当前按键的值。不过有兼容性问题。
keyCode属性的值与ASCII码中小写字母或数字对应的编码相同。

//html
<input type="text" name="input" id="myInput" value="1">

//js
document.getElementById('myInput').addEventListener('keydown',function(e){
    console.log(e.type);
    console.log(e.target.value);
    console.log(e.keyCode);
})
2、keypress

当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件。按下功能键不会触发。
在所有浏览器中,按下能够插入或删除字符的键都会触发keypress事件。

与keydown一样,可以通过e.keyCode获得当前按下的键值。也可以通过charCode获得当前按下的键所代表字符的ASCII编码。charCode只有在发生keypress事件时才包含值,此时的keyCode通常等于0或者也可能等于所按键的键码。
要想以跨浏览器的方式取得字符编码,必须首先检测charCode属性是否可用,如果不可用则使用keyCode。
在取得了字符编码之后,就可以用String.formCharCode()将其转换成实际的字符。

if(typeof e.charCode == 'number'){
   return e.charCode;
}else{
  return e.keyCode;
}
3、keyup

当用户释放键盘上的键时触发。

说明

在用户按了一下键盘上的字符键时,首先会触发keydown事件,然后紧跟着是keypress事件,最后会触发keyup事件。其中,keydown和keypress都是在文本框发生变化之前被触发的;而keyup事件则是在文本框已经发生变化之后被触发的。如果用户按下一个字符健不放,就会重复触发keydown和keypress事件,走到用户松开键为止。
如果用户按下的是一个非字符键,那么首先会触发keydown事件,然后就是keyup事件。如果按住这个非字符键不放,那么就会一直重复触发keydown事件,走到用户松开这个键,此时会触发keyup事件。

textInput

此事件只有在能触发keypress的情况下才会触发,是对keypress的补充,用意是在将文本显示给用户之前更容易拦截文本。在文件插入文本框之前后触发textInput事件。
目前兼容性不太好,firefox(50.1.0)不支持,chrome(版本 55.0.2883.95 (64-bit))、safari(版本 9.1.2)支持,其它浏览器未试过。

触发顺序(在支持此事件的浏览器中):
  • keydown
  • keypress
  • textInput
  • keyup

通过e.data获取当前的按键值

备注

这是一篇学习《Javascrpt高级程序设计》(第3版)的学习笔记,之所以发出来是因为在网上查找textInput事件时看到一些文章对keypress的描述不准确。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对键盘事件的支持主要遵循DOM0级,虽然DOM3级为键盘事件制定了规范,但是并不是所有浏览器的支持的。为了提高网页...
    Miss____Du阅读 1,338评论 6 6
  • 一、键盘事件基础 1、定义 keydown:按下键盘键 keypress:紧接着keydown事件触发(只有按下字...
    07120665a058阅读 51,048评论 5 33
  • Web 浏览器中可能发生的事件有很多类型。如前所述,不同的事件类型具有不同的信息,而 DOM3 级事件规定了以下几...
    More_5897阅读 1,005评论 1 0
  • 事件流 IE和Netscape开发团队提出了完全相反的两种事件流的概念,事件冒泡流和事件捕获流。 事件冒泡 事件由...
    exialym阅读 1,007评论 0 9
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,659评论 2 10