事件类型
Web浏览器可能发生很多事件。DOM3规定了如下几类事件
UI事件
当用户与页面上的元素交互时触发
- load事件
当页面完全加载(所有图像,js文件,css文件等外部资源 )后就会触发window上面的load事件
<img src="logo.icon" onload="alert('logo loaded!')">
//js实现
let img = document.querySeletor("#myImg");
img.addEventListener("load",function(event){
alert('logo loaded!');
},false)
-
unload事件
与load对应,文档被完全卸载后触发。用户从一个页面切换到另一个页面就会发生unload事件。一般应用于清除应用,以避免内存泄漏 -
resize事件
当浏览器窗口被调整到一个新的高度或或宽度时,就会触发resize事件
事件在window上触发,可通过body的onresize特性来指定事件处理函数,一般还是用js -
scroll事件
window对象上触发,混杂模式下可通过body元素的scrollLeft和scrollTop来监控这一变化;标准模式除Safair之外的会根据html元素来反映变化
焦点事件
当元素获得或失去焦点时触发
- blur: 在元素试去焦点时触发,这个事件不会冒泡,所有浏览器都支持它
- DOMFocusIn:在元素获得焦点时触发(only Opera),等价于focus,DOM3已废弃选择了focusin
- DOMFocusOut:在元素失去焦点时触发(only Opera),blur的通用版本;DOM3已废弃,选择了focusout
- focus:在元素获得焦点时触发,不冒泡,所有浏览器都支持
- focusin:在元素获得焦点时触发,冒泡
- focusout:在元素失去焦点时触发,冒泡
利用这些事件并于document.hasFoucus()和document.activeElement属性配合,可以知晓用户在页面上的行踪
当焦点从一个元素到另一个元素时,触发的事件顺序
- focusout 在失去焦点的元素上触发
- focusin 在获得焦点的元素上触发
- blur 在失去焦点的元素上触发
- DOMFocusOut 在失去焦点的元素上触发
- focus 在获得焦点的元素上触发
- DOMFOcusIn 在获得焦点的元素上触发
鼠标事件
当用户通过鼠标在页面上执行操作时触发
- click事件 用户单击主鼠标键(一般为左键)或者按下回车键
- dbclick事件 用户双击主鼠标键
- mousedown 用户按下任意鼠标按键时触发
- mouseenter 鼠标光标从元素外部首次移动到元素范围之内时触发,不冒泡,而且在光标移动到后代元素上不会触发
- mouseleave 在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡,而且在光标移到到后代元素上不会触发
- mousemove 当鼠标指针在元素内部移动时重复地触发
- mouseout 鼠标从一个元素移入到另一个元素,事件的主目标是失去光标的元素
- mouseover 鼠标从一个元素外部,首次移入到另一个元素边界之内时触发,事件的主目标是获得光标的元素
- mouseup 用户释放鼠标按钮时触发
点击事件触发顺序
- mousedown
- mouseup
- click
- mousedown
- mouseup
- dbclick
鼠标事件中存在的部分属性
- clientX 鼠标指针在视口的水平坐标
- clientY 鼠标指针在视口的垂直位置
- pageX 页面水平位置
- pageY 页面垂直位置
在没有滚动的清空下clientX == pageX - screenX 相对于屏幕的水平坐标
- screenY 相对于屏幕的垂直坐标
- shiftKey(shift键),ctrlKey(ctrl键),altKey(alt键),metaKey(windows中是win键,mac中是Cmd键),true表示这些键被按下
- button 0表示主键(左),1表示滚轮,2表示次键(右),这个对于IE需要做兼容处理
- detail 对于点击事件,表示点击次数,前提是鼠标不移动
滚轮事件
当用户使用鼠标滚轮(或类似设备)时触发
- mousewheel事件 用户通过鼠标滚轮与页面交互,在垂直方向上滚动页面时,就会触发,最终会冒泡到document(IE8)或者window(IE9,Opera,Chrome,Safari)
- mouseDelta属性 向前滚动时,120的倍数;向后滚动时,-120的倍数
Opera9.5之前正好是相反的,估计也没这么老的机子了,现在Opera都60了
Firefox支持一个DOMMouseScroll事件,信息保存在detail属性中是3的倍数和-3的倍数
触摸设备注意事项
iOS和Android
- 不支持dbclick.双击会放大浏览器
- 轻击可单击元素(绑定onclick,或者链接等)会触发mouseover事件;如果屏幕没有变化,依次触发mousedown,mouseup,click;轻击不可单击元素不会触发任何事件
- mousemove事件也会触发mouseover,mouseout
- 两个手指放在屏幕上且随手指移动而滚动时会触发mousewheel和scroll事件
- 对于特殊人群,尽量用click来处理点击事件