JavaScript事件类型综述

声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!

检测事件支持版本

//检测浏览器是否支持DOM2级HTML事件,支持则返回true
var isSupported = document.implementation.hasFeature("HTMLEvent","2.0");

//检测浏览器是否支持DOM3级事件,支持则返回true
var isSupported = document.implementation.hasFeature("UIEvent","3.0");

UI事件

UI事件指那些不一定与用户操作有关的事件

事件说明
DOMActivate表示元素已被用户操作(鼠标或键盘)激活,不建议使用
load当页面完全加载后在window上触发,当图像加载完毕后在<img>元素上触发,当嵌入的内容加载完毕后在<object>元素上面触发
unload当页面完全卸载后在window上触发,当嵌入的内容卸载完毕后在<object>元素上面触发
abort当用户停止下载时,若嵌入的内容没有加载完,则在<object>元素上面触发
error当发生JavaScript错误时在window上触发,当无法加载图像时在<img>元素上触发,当无法加载嵌入的内容时在<object>元素上面触发
select当用户选择文本框(<input>或<textarea>)中的字符时触发
resize当窗口的大小发生变化时在window上触发
scroll当用户滚动带滚动条的元素时,在该元素上触发(body元素包含所加载页面的滚动条)
  • 除DOMActivate属于DOM3之外,其他UI事件都属于DOM2

一般来说,在window上发生的任何事件都可以在<body>元素中通过相应的特性来指定,例如<body οnlοad="……">

焦点事件

事件说明
blur在元素失去焦点时触发,不会冒泡,所有浏览器都支持
focus在元素获得焦点时触发,不会冒泡,所有浏览器都支持
focusin在元素获得焦点时触发,会冒泡,多数浏览器支持
focusout在元素失去焦点时触发,会冒泡,多数浏览器支持

当焦点从页面中的一个元素移动到另一个元素时,会依次触发以下事件:

  1. focusout在失去焦点的元素上触发
  2. focusin在获得焦点的元素上触发
  3. blur在失去焦点的元素上触发
  4. DOMFocusOut在失去焦点的元素上触发
  5. focus在获得焦点的元素上触发
  6. DOMFocusIn在获得焦点的元素上触发

鼠标事件

事件说明
click点击鼠标或按下回车时触发(一般是鼠标左键)
dblclick双击鼠标时触发(一般是鼠标左键)
mousedown按下任意鼠标按钮时触发
mouseup当用户释放鼠标按钮时触发
mouseleave在鼠标光标从元素上移到元素外部时触发,该事件不冒泡,在光标移到后代元素上时不触发
mouseenter在鼠标光标首次从元素外部移入元素范围内时触发,该事件不冒泡,在光标移到后代元素上时不触发
mouseout当鼠标光标位于一个元素上方,又移入另一个元素时触发,另一个元素可能位于前一个元素外部,也可能是前一个元素的子元素
mouseover在鼠标光标首次从元素外部移入元素或其子元素范围内时触发
mousemove当鼠标光标在元素内部移动时重复触发
  • dblclick、mouseenter、mouseleave为DOM3事件,其他为DOM2事件

移入移出事件

在原生JS中鼠标移入移出事件有四个,分别为mouseover ,mouseout ,mouseenter,mouseleave,其中mouseover和mouseenter为移入事件,mouseou和mouseleave为移出事件

  • mouseover: 只要鼠标指针移入事件所绑定的元素或其子元素,都会触发该事件
  • mouseenter: 只有鼠标指针移入事件所绑定的元素时,才会触发该事件
    • 如果一个元素没有子元素,那么该元素绑定mouseover或者mouseenter两种事件效果没有区别,鼠标每次移入元素时都只会触发一次事件;如果绑定了mouseover事件的元素存在子元素,那么,每次移入该元素时都会触发一次事件(包括从外部移入和从子元素移入),移入子元素时也会触发一次事件

鼠标点击事件

mousedown、mouseup、click、dblclick四个事件的触发顺序如下:

  1. mousedown
  2. mouseup
  3. click
  4. mousedown
  5. mouseup
  6. click
  7. dblclick

鼠标位置

视口坐标位置
  • 使用 event.clientX 和 event.clientY 属性访问
页面坐标位置
  • 使用 event.pageX 和 event.pageY 属性访问
  • 在页面没有滚动的情况下,pageX和pageY的值与clientX和clientY的值相等
屏幕坐标位置
  • 使用 event.screenX 和 event.screenY 属性访问

修改键

修改键包括4个键:Shift、Ctrl、Alt、Meta(windows是Win,苹果是Cmd)

DOM为此规定了4个属性,表示这些修改键的状态:event.shiftKey、event.ctrlKey、event.altKey、event.metaKey

这些属性都是布尔值,如果相应按键被按下,则为true,否则为false

相关元素

DOM通过event对象的relatedTarget属性提供了相关元素的信息,这个属性只对于mouseover和mouseout事件才包含值

  • 对于mouseover事件,事件的主目标是获得光标的元素,而相关元素则为失去光标的那个元素
  • 对于mouseout事件,事件的主目标是失去光标的元素,而相关元素则为获得光标的那个元素
  • 对于其他事件,这个属性是null

鼠标按钮

对于mousedown和mouseup事件来说,其event对象存在一个button属性,表示按下或释放的按钮

DOM的button属性包含3个值:

  • 0:主鼠标按钮(鼠标左键)
  • 1:中间鼠标按钮(鼠标滚轮键)
  • 2:次鼠标按钮(鼠标右键)

更多事件信息

DOM2在event对象中提供了detail属性,用于给出有关事件的更多信息

对于鼠标事件,detail属性包含一个数值,表示在给定位置上发生了多少次单击,detail属性从1开始计数,如果鼠标在mousedown和mouseup之间移动了位置,则detail属性会被重置为0

滚轮事件

当用户通过鼠标滚轮与页面交互(滚动)时,就会触发mousewheel事件,这个事件可以在任何事件上触发,最终冒泡到window上

与mousewheel事件对应的event对象除了包含鼠标事件对象的所有属性外,还包含一个特殊的mouseDelta属性,当用户向前滚动鼠标滚轮时,mouseDelta是120的倍数,当用户向后滚动鼠标滚轮时,mouseDelta是-120的倍数

键盘与文本事件

  • 由3个键盘事件:
    • keydown:用户按下键盘上任意键时触发,按住不放会重复触发该事件
    • keypress:用户按下键盘上字符键时触发,按住不放会重复触发该事件
    • keyup:当用户释放键盘上的键时触发
  • 文本事件只有一个:
    • textInput:在文本插入文本框之前会触发textInput事件
  • 当用户按下键盘上的字符键时:先触发keydown,然后是keypress,最后是keyup
  • 当用户按下键盘上的非字符键时:先触发keydown,然后是keyup
  • 键盘事件也支持相同的修改键:event.shiftKey、event.ctrlKey、event.altKey、event.metaKey
  • textInput与keypress的区别:
    • textInput只有在可编辑区域才能被触发
    • textInput事件只会在用户按下能够输入实际字符的键时才会被触发,keypress事件在按下能够影响文本显示的键时也会触发

键码

在发生keydown和keyup事件时,event对象的keyCode属性会包含一个代码,与键盘上一个按键对应

  • 对于数字字母字符键,keyCode的值就是ASCII码中对应小写字母或数字的编码相同
  • 非字符键码详见《JavaScript高级程序设计 第三版》p380

字符编码

  • 发生keypress事件意味着按下的按键会影响屏幕中文本的显示

  • 按下能够插入或删除文本的按键都会触发keypress事件

  • 除opera浏览器外的其他浏览器的event对象都支持一个charCode属性,这个属性只有发生keypress事件时才包含值,值是按下的那个键所代表字符的ASCII码

  • 取得字符编码后,就能通过String.fromCharCode()方法将其转为字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值