事件类型
鼠标事件
- click 点击
- dblclick双击
- mouseover || mouseenter鼠标移入
- mouseout || mouseleave鼠标离开
onmouseover和onmouseenter的区别??
onmouseout和onmouseover 存在冒泡
onmouseout和onmouseover是忽略元素之间的层级关系,只看鼠标在哪个元素显示的范围上,存在事件冒泡
mouseenter和mouseleave会受到元素之间的层级关系,默认阻止了事件冒泡机制 键盘事件
键盘事件
- keydown键盘按下
- keyup键盘抬起
- keypress 键盘按键被按下并释放一个键时发生
在所有浏览器中 onkeypress 事件不是适用于所有按键(如: ALT, CTRL, SHIFT, ESC)。监听一个用户是否按下按键请使用 onkeydown 事件,所有浏览器都支持 onkeydown 事件
只有input、textarea、window、document.documentElement、document.body可以绑定键盘事件
表单事件
- input 只要内容(value)改变就会触发(移动端用,代替keyup keydown)
- change 内容改变并且失焦才触发
- focus 获取焦点
- blur 失去焦点
系统事件
- scroll 监听滚动
- load 监听页面渲染
- resize 监听页面视口大小改变
- $(document).ready() jQuery里的ready事件,原生没有。
- ready和load区别:ready是页面DOM结构加载完成就会触发,比onload触发早
移动端事件
- click 在移动端可以用,但是有300ms延迟
- touchmove 手指移动
- touchstart 手指按下
- touchend 手指抬起
事件定义(3种方法)
直接在HTML中定义元素的事件相关属性(DOM0)(此语法违反了内容与行为的相分离的原则)
在javascript中为元素的事件相关属性赋值(DOM0)
基于给元素的私有属性赋值,当条件达到触事件发私有属性方法
- 1.如果元素没有某个事件的私有属性,就不能基于这个方法绑定0级事件
- 2.只能绑定一个方法,如果多个绑定,只有最后一个绑定上
- 3.都是冒泡阶段触发
高级事件处理方式(事件监听),一个事件可以绑定多个监听函数(DOM2)
基于浏览器事件池机制来完成的,通过addEventListener往事件池中增加方法,
1.只要浏览器中有这个事件,都可以通过2级事件来绑定,DOMContentLoaded(jquery中的ready事件就是监听这个事件实现的)
2.同一个事件可以绑定多个方法,触发顺序,先绑定的先触发
3.可以人为规定在捕获或冒泡阶段触发,默认是在冒泡阶段
4.DOM2级事件如果不兼容IE的话需要省去on
.移除事件(2种)
1.DOM0级和普通绑定事件,移除事件 btn.οnclick=null;
2.DOM2级, 移除事件
var btn = document.getElementById("myBtn");
var handler = function () {
alert(this.id);
};
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false);
DOM事件流
事件流描述的是从页面中接受事件的顺序,事件发生时会在元素节点之间 按照特定的顺序传播,这个传播过程即DOM事件流
dom事件流分为三个阶段
- 1.捕获阶段,事件对象沿dom树向下传播(由外向里)
- 2.'目标触发,运行事件监听函数
- 3.事件冒泡,事件沿dom树向上传播 (有里向外)
我们向水面扔一块石头,首先他会有一个下降的过程,这个过程我们可以理解为从最顶层向事件发生的具体元素(目标点)的捕获过程,之后产生泡泡,会在最低点(最具体元素)之后漂浮到水面上,这个过程相当于事件冒泡
事件冒泡 IE最早提出 事件开始由具体的元素接收,然后逐级向上传播到dom最顶层节点对的过程
事件捕获 网景最早提出 由DOM最顶层节点开始 然后逐级向下传播到具体的元素接受的过程
[注意]
js只能执行捕获或者冒泡其中的一个阶段
onclick 和attachEvent只能得到冒泡阶段
addEventListener{事件属性, 监听函数,冒泡或捕获阶段}
第三个参数如果是true表示在事件捕获阶段调用事件处理程序如果是false(不写默认是false)表示在事件冒泡阶段调用事件处理函数
<div id="diva">
<p id="pb">
<span id="spanc"></span>
</p>
</div>
<script>
var diva = document.getElementById("diva");
var pb = document.getElementById("pb");
var spanc = document.getElementById("spanc");
// 冒泡阶段 方向-- -> 由里向外(span-- -> p-----> div)
diva.onclick = function () {
alert("div");
}
pb.onclick = function () {
alert("p");
}
spanc.onclick = function () {
alert("span");
}
//捕获阶段 方向--->由外向里(div--->p----->span)
diva.addEventListener("click", function () {
alert("div");
}, true)
pb.addEventListener("click", function () {
alert("p");
}, true)
spanc.addEventListener("click", function () {
alert("span");
}, true)
事件代理
事件代理(event delegation):事件代理又称事件委托,是javaScript中绑定事件的常用技巧。顾名思义,‘事件代理’就是把原本需要绑定的事件委托给父元素,让父元素负责事件监听。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能
事件委托的好处:
1.减少事件数量,提高性能
2.预测未来元素,新添加的元素仍然可以触发该事件
3.避免内存外泄,在低版本的IE中,防止删除元素而没有移除事件而造成的内存溢出
event对象
定义
- event就是一个事件对象 写到我们监听函数的小括号里面 当形参来看,
- 事件对象只有事件才会存在, 他是系统自动创建的,不需要我们传递参数
- 事件对象是我们事件的一系列 相关数据的集合 跟事件相关的 比如鼠标点击包含了鼠标相关信息 鼠标坐标,如果是键盘事件里面包含了键盘事件的信息,比如 判断用户按下了那个键
- 这个事件对象我们可以自己命名 比如event evt e
- 事件对象有兼容性问题 通过window.event
事件对象常用的属性和方法
e.target e.srcElement 返回触发事件对象
e.type返回事件类型 不带on
e.preventDefult()阻止默认行为
e.stopPropagation 阻止冒泡 (阻止传播)
鼠标事件对象
e.clientX clientY 返回鼠标相对于浏览器窗口可视区的xy坐标
e.pageX e.pageY 返回鼠标相对于文档页面的xy坐标
e.screenX e.screenY 返回鼠标相对于电脑屏幕xy坐标
e.offsetX e.offset.Y 返回鼠标相对于自身的xy坐标
键盘事件对象
e.key键盘按键内容a--->a
e.code 英文键盘字符a--->keyA
e.keyCode是键盘数字a--->65
e.target和this的区别?
e.target返回的是触发事件的对象, this返回的是绑定事件对象(元素)
区别:e.target点了那个元素就返回那个元素, this那个元素绑定了这个点击事件那么就返回谁
----------------------------------------------------完结,散花------------------------------------------------------------
---------------------------------接受大佬们的批改,欢迎留言------------------------------------------------