事件高级
今天学习事件高级,下面是我们的学习目标
注册事件概述
给元素添加事件,称为注册事件或者绑定事件
注册事件有两种方法:传统方式和方法监听注册方式
传统注册方式
- 利用on开头的事件如onclick
- btn.onclick = function() {}
- 特点:注册事件的唯一性
- 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数(比如说写两次btn.onclick但分别设置一个alert('say hi '))和一个alert('say hello'),最后执行的肯定是'say hello'.
方法监听注册方式
- w3c标准 推荐方式
- addEventListener()它是一个方法
- IE9之前的IE不支持此方法,可使用attachEvent代替
- 特点: 同一个元素同一个事件可以注册多个监听器
- 按注册顺序依次执行
eventTarget.addEventListener( type,listener[ , useCapture] )
eventTarget.addEventListener(type,listener[, useCapture])方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数
该方法接收三个参数
- type: 事件类型字符串,比如click.mouseover,注意这里不带on
- listener: 事件处理函数,事件发生时,会调用该监听函数
- useCapture: 可选参数,是一个布尔值,默认是false.学完DOM事件流后,我们再进一步学习
但是他就可以同时设置很多个事件函数:
删除事件(解绑事件)
比如我们想要点击完一个div盒子以后弹出对话框,但是后面再点击就不会弹出,那么我们就需要学习删除事件.
传统注册方式
eventTarget.onclick = null;
方法监听注册方式
eventTarget.removeEventListener(type, listener[, useCapture]);
一开始是这种想法,不过后来才发现是不行的.
我们得换种思路,将我们的事件封装成函数,写入监听注册中,这样就能删除事件也可以直接将函数写入(但是记住不要加( )!!! ).
DOM事件流
事件流描述的是从页面中接收事件的顺序.
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流.
比如我们给div注册了点击事件:
DOM事件分为三个阶段:
- 捕获阶段
- 当前目标阶段
- 冒泡阶段
事件冒泡: IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程
事件捕获: 网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程.
注意:
- JS代码中只能执行捕获或者冒泡其中的一个阶段
- onclick和attachEvent只能得到冒泡阶段
- addEventListener(type,listener[, useCapture]) 第三个参数是true,表示在事件捕获阶段调用事件处理程序;如果是false,(不写默认就是false),表示事件在冒泡阶段调用事件处理程序.
(这一块好难懂...)
我们试一下就能理解了
- 实际开发中我们很少使用事件捕获,我们更关注事件冒泡
- 有些事件是没有冒泡的,比如onblur/onfocus/onmouseenter/onmouseleave
- 事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事情,我们后面详解
事件对象
我们以前写这个点击事件的时候,function后面的()是空的,现在我们在里面写入一个event(里面写什么都可以,但是比较常见的是event/evt/e)
- event就是一个事件对象,写到我们的侦听函数里面的小括号里,当形参来看.
- 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
- 事件对象:是我们事件的一系列相关数据的集合,和事件相关的,比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标等,如果是键盘事件就包含的键盘事件的信息,比如判断用户按下了哪个键
- 事件对象也有兼容性的问题,IE678通过window.event 兼容性的写法: e || window.event
官方解释: event对象代表事件的状态,比如键盘按键,鼠标的位置,鼠标按钮的状态
简单理解: 事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法
事件对象的常见属性和方法
我们看看结果:
兼容性写法:(IE一生之敌!!!)
e.preventDefined 阻止默认事件(默认行为) 比如不让链接跳转,或者不让提交按钮提交,需满足条件才能执行
还有个方法: return false,但是只有传统注册方式才可以用
阻止冒泡事件
事件冒泡: 开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点. 事件冒泡本身的特性,会带来的坏处,也会带来好处,需要我们灵活掌握.
现在我们放两个盒子:
所以后面的father和document都不会执行
今天先学别的啦,明天继续学