事件监听和事件绑定的区别
开发项目的过程避免同一元素上重复添加事件例如onclick = fn。使用addEventListener()事件监听器
- 重复添加addEventListener,而且互相不会排斥
- 移动端也使用addEventListener,但不支持onclick 这种事件绑定
事件监听
-
addEventListener(type, listener[, options|useCapture])
type是不用加on的
listener 一个事件处理函数
useCapture 是否捕获执行
-
removeEventListener
-
取消事件监听
-
取消事件监听时候只能删除命名函数,不能删除匿名
// js当中 对象 是独立的 唯一的 // 取消/删除事件监听 必须删除的是命名函数 var fn1 = function(){ alert(1); } var fn2 = function(){ alert(1); } console.log(fn1==fn2) //false document.addEventListener('click',fn1) // 命名函数的删除(无法删除匿名函数) document.removeEventListener('click',fn1)
-
-
事件执行顺序-冒泡顺序,捕获顺序
-
事件执行顺序 --事件冒泡顺序从内到外依次冒泡执行
-
事件捕获执行,事件监听的第三个参数为true。点击底层时候从外向内捕获,从内向外再冒泡
-
-
事件监听相关配置(第三个参数)
- capture 是否在捕获阶段执行
- once 是否只执行一次
- passive 阻止取消默认事件
- 浏览器提供的默认行为,例如a标签点击会跳转、鼠标右键事件
- 这个参数会阻止Event.preventDefault()函数生效
Event事件对象
-
取消冒泡
- 阻止事件往外执行
- Event.stopPropagation() 取消冒泡
- Event.cancelBubble = boolean 取消冒泡
-
Event.target、Event.currentTarget 事件源
- Event.target获取当前点击事件的dom元素
- Event.currentTarget 事件源,添加点击事件的dom 元素
-
事件委托(事件代理)
-
思路:利用一直存在与页面中的元素,给未来即将添加元素添加事件。利用e.target
-
事件委托的优点
- 可减少需要添加事件绑定的元素
- 可给新增DOM元素添加事件(在不刷新页面的情况下)
-
事件委托的缺点
- 事件处理函数中需要判断事件源增加逻辑复杂度
- 祖父级和事件源之间不能有阻止冒泡
-
mousenter、mouseleave 事件
- mouseover mouseout 会触发事件冒泡,出现父级移出再移入的现象
- mousenter、mouseleave 不会触发事件冒泡,不会在鼠标移动父子级切换过程中触发
-
鼠标位置获取
- Event.clientX、Event.clientY、鼠标距离可视区的距离
- Event.pageX、Event.pageY 、鼠标距离可视区的距离 + 滚动条距离顶部的距离
-
contextmenu 鼠标右键事件
-
Event.preventDefault() 阻止默认事件
- 阻止鼠标右键菜单弹出
- 和事件监听passive 参数互相排斥
-
return false 阻止鼠标右键事件
-
window.oncontextmenu = function(){ console.log(2); return false; } //这种方法可以阻止鼠标右键事件 ,不推荐
-
-
自定义浏览器右键菜单
- 先阻止后自定义
键盘事件
- keydown、keyup 任何键按下或者抬起时候触发
- Event.keyCode、Event.key
- Event.keyCode 键值的代号
- Event.key 键的具体值
- Event.altKey、Event.ctrlKey、shiftKey
- 功能键的布尔值
- 制作组合键
- 问题一:卡顿
- 浏览器容错机制造成的卡顿问题:系统要区分用户是否连续输入,第一个到第二个之间有一个停顿时间
- 思路:先开一个定时器,让div一直处于(往4个方向)准备移动的状态(初始4个方向的值都是false,div就保持在原地不动),当按下某个方向键,这个方向的值就改变为true,div就会开始往这个方向移动,松开方向键,这个方向的值就改变为false , div就停止这个方向移动了。
- 问题二:控制元素移动时候可以同左上,右下的走,利用setInterval
- 思考:什么时候需要setInterval 什么时候停止移动
鼠标拖拽事件
-
mousedown、mousemove、mouseup
- mousemove鼠标移动
- mousedown鼠标按下
- mouseup鼠标抬起
-
拖拽公式
- 拖拽公式:元素当前位置 = (鼠标当前位置 - 鼠标初始位置) + 元素初始位置
-
获取xy原始值
-
parseFloat(getComputedStyle(el)[attr]);
-
-
拖拽问题修复
- 移动太快,鼠标脱离元素造成的bug.
- 解决,移动事件加给window 让他不能脱离
- 元素和文本元素同时存在时候拖动元素,会选中文字
- 解决,在鼠标添加点击拖拽的事件的函数里面添加e.preventDefault(); 阻止浏览器的默认行为
- 移动太快,鼠标脱离元素造成的bug.
-
限制范围拖拽
- 当前位置和最小值比较
- 当前位置和最大值比较
-
复制拖拽
- cloneNode();
鼠标滚轮事件
-
mousewheel 和 DOMMouseScroll 事件
-
mousewheel 谷歌浏览器鼠标滚轮的事件
-
DOMMouseScroll 火狐浏览器鼠标滚轮的事件
-
方法:万能的封装:两个方法都添加,封装一个方法
//调用滚轮函数 mouseWheel(document.body,function(){ console.log(1) }) // 鼠标滚轮函数封装 function mouseWheel(obj,downFn,upFn){ // 滚轮滚动执行 火狐事件 obj.addEventListener('DOMMouseScroll',function(e){ // console.log(e.detail) if(e.detail>0){ // console.log('向下') downFn&&downFn.call(obj) }else{ // console.log('向上') upFn&&upFn() } }) // 滚轮滚动执行 chrome obj.addEventListener('mousewheel',function(e){ // console.log(e.wheelDelta) if(e.wheelDelta>0){ // console.log('向上') upFn&&upFn() }else{ // console.log('向下') downFn&&downFn() } }) }
-
-
Event.wheelDelta 和 Event.detail 滚轮方向获取
- Event.wheelDelta 正值是向上滚动 --chorme
- Event.wheelDelta 负值是向下滚动 --chorme
- Event.detail 负值是向上滚动 -- firefox
- Event.detail 正值是向下滚动 -- firefox
其他事件
-
dblclick 双击事件
-
表单事件
- blur、光标失去焦点
- focus、光标获得焦点
- change、值改变的时候触发,多用与checkbox radio ,
- input、值改变的时候触发,多用与text ,
- submit、提交事件,用于form表单 + submit button
- reset、重置表单事件