事件(高级)
一 注册事件(绑定事件)
1.注册事件概述
给元素添加事件,称为注册事件或者绑定事件
注册事件有两种方式: 传统方式和方法监听注册方式
传统事件方式:
- 利用on开头的事件 例onclick
- <button onclick = 'alert("hi~")'></button>
- btn.onclick = function(){}
- 特点:注册事件的唯一性
- 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
方法监听注册方式(推荐)
- W3C标准推荐方式
- addEventListener()它是一个方法
- IE9之前的IE不支持此方法,可使用attachEvent()代替
- 特点:同一个元素同一个事件可以注册多个监听事件
- 按注册顺序依次执行
addEventListener() 推荐
语法: eventTarget.addEventListener( type, listener[ , useCapture ] )
eventTarget.addEventListener( ) 方法将指定的监听器注册到evenTarget ( 目标对象) 当该对象触发指定的事件时,就会执行事件处理函数.
该方法接收三个参数:
- type: 事件类型字符串 ,比如:click,mouseover ,注意:这里不带on,加引号.
- listener :事件处理函数 ,事件发生时,会调用该监听函数
- useCapture : 可选参数,是一个布尔值 ,默认是false .
attachEvent() 了解
语法: eventTarget.attachEvent( evenNameWithOn ,callback)
eventTarget.attachEvent( ) 方法将指定的监听注册到eventTarget(目标对象)上,当该对象触发指定事件时,指定的回调函数就会被执行.
该方法接受两个参数:
- evenNameWithOn :事件类型字符串 ,比如 onclick ,onmouseover 注意:要带on
- callback : 事件处理函数,当目标触发事件时回调函数被调用
解决兼容性问题: 封装函数
二 删除事件(解绑事件)
1.删除事件的方式
① 在使用传统注册方式的前提下:删除事件方法:
eventTarget.onclick = null ;
② 在使用方法监听注册方式的前提下 : 删除事件方法:
eventTarget.removeEventListener( type, listener[ , useCapture ] );
注意:不能用匿名函数.将事件处理函数写在外面,把事件处理函数的名字写到里面.(里面的函数不需要小括号)
③在使用 attachEvent() 注册方式前提下:删除事件方法:
eventTarget.detachEvent( evenNameWithOn ,callback) ;
删除事件兼容性解决方案:
三 DOM事件流
事件流 描述的是从页面中接收事件的顺序.
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
DOM事件流分为3个阶段: 1.捕获阶段 2. 当前目标阶段 3冒泡阶段
注意:1. JS代码中只能执行捕获阶段或者冒泡其中的一个阶段
2. onclick 和 attachEvent 只能得到冒泡阶段
3.eventTarget.removeEventListener( type, listener[ , useCapture ] ); 第三个参数如果是true ,表示在事件捕获阶段调用事件处理程序;如果是false或者不写,表示在时间冒泡阶段调用事件处理程序.
4.实际开发中很少使用捕获,更关注事件冒泡.
5.有些事件是没有冒泡的 ,比如 :onblur ,onfocus ,onmouseenter ,onmouseleave
四 事件对象
什么是事件对象:
官方解释: event 对象代表事件的状态,比如键盘案件的状态,鼠标位置 ,鼠标按钮
简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放在这个对象里面,这个对象就是事件对象event ,它有 很多属性和方法
1. 事件对象写在 监听函数的小括号里, 这个事件可以自己命名 一般是event ,evt ,e(推荐). 当作形参来看的,
2.事件对象只有有了事件才存在,是自动创建的,不需要传递参数 .
3.事件对象是我们一系列相关数据的集合,跟事件相关的, 比如鼠标点击里面就包含了相关信息.
4. 事件对象也有兼容性问题 在ie 678 中 只能用 window.event .
解决方法 e = e || window.event
事件对象的常见的属性和方法:
五 阻止事件冒泡
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
阻止事件冒泡的两种方法 :
1.标准写法 : 利用事件对象里面的 stopPropagation ()方法 有兼容性问题
e.stopPropagation ()
2.非标准写法: IE 6-8 可用
cancelBubble 属性
兼容性解决方法:
六 事件委托(代理,委派)
事件委托
事件委托 也称为事件代理 ,在jQuery里面称为事件委派
事件委托的原理
不要给每个子节点单独设置事件监听器,而是把事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点
事件委托的作用
只操作一次DOM ,提高了程序的性能.
七 常用鼠标事件
1.禁止鼠标右键菜单
contexmenu 主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单
2.禁止鼠标选中(selectstart 开始选中)
鼠标事件对象
event 对象代表事件的状态,跟事件相关的一系列信息的集合,
现阶段主要是用鼠标事件对象MouseEvent和键盘事件对象KeyboardEvent
实际开发中:常用page ;
案例:跟随鼠标移动的图片
<style>
img{
height: 40px;
position: absolute;
}
</style>
<img src="1.png" alt="">
<script>
var pic =document.querySelector('img');
document.addEventListener('mousemove' ,function(e){
var x = e.pageX;
var y = e.pageY;
var pic =document.querySelector('img');
pic.style.left = x +'px';
pic.style.top = y -20 + 'px';
})
</script>
八 常用键盘事件
1. 常用键盘事件
注意:1.如果使用addEventListener不需要加on
2.onkeypress 和前面2个区别是,他不识别功能键,比如左右箭头,shift等
3.三个事件的执行顺序是:keydown ----- keypress ------ keyup
2.键盘事件对象
键盘事件对象 属性 | 说明 |
keyCode | 返回该键的ASCII值 |
注意:1.onkeydown 和onkeyup 不区分大小写, onkeypress区分字母大小写
2.在实际开发中:更多的使用keydown 和keyup 能识别所有键
案例 : 模拟京东按键输入内容 :当按下s键时定位到搜索框;
<input type="text">
<script>
var search = document.querySelector('input');
document.addEventListener('keyup' , function(e){
// console.log(e.keyCode); 获得s的ASCII的值
if(e.keyCode === 83){
search.focus();
}
})
</script>
注意: keydown 和 keypress 在文本里面的特点:事件触发的时候,文字还没有落入文本框。
keyup 事件触发的时候 ,文字已经落入到文本框里了。