事件流与事件委托
来源:互联网 发布:c语言可视化ide 编辑:程序博客网 时间:2024/06/05 06:06
事件对象:当一个对象触发了所绑定的事件,所发生的一切详细信息都将保存在一个临时的地方,这个地方就叫做事件对象(相当于黑匣子)
1、通过触发事件时给处理函数所传递的第一个参数(evt),就是事件对象;(不兼容IE8及以下跟谷歌早期版本)
2、通过内置的全局对象:window.event来获取事件对象(只兼容IE9以下和谷歌早期版本)(IE9及以上不能用)
//兼容 var e = evt || window.event
一、事件流:(浏览器默认启动为事件冒泡)
(一)事件冒泡:由子节点依次向父节点,一直到祖先节点传递事件,这个过程称为事件冒泡。在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序(事件委托)或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。
阻止事件冒泡的方法
event.stopPropagation(); //标准
event.cancelBubble = true; //IE的方式
//兼容
event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;
(二)事件捕获:由祖先节点向子节点层层传递,传递到最底层的子节点,这个过程称为事件捕获;(IE不支持事件捕获)
捕获阶段是一个和冒泡阶段完全相反的过程,即事件由祖先元素向子元素传播,和一个石子儿从水底下沉一样,(要说明的是在IE、Opera浏览器中,是不存在这个阶段的。)从各个浏览器提供的注册事件监听的方法中可见一斑,例如适用于IE、Opera的attachEvent,有两个参数:attachEvent("on" + event,fn)(event代表事件名,如:"click"),二所谓的标准浏览器的addEventListener则有三个参数:addEventListener(event,fn,boolean),第三个参数boolean,就是决定注册事件发生在捕获阶段(true)还是冒泡阶段(false)。
二、事件委托机制
什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
利用冒泡的原理,把事件加到父级上,触发执行效果。
作用:提高性能
例如:
<ul>
<li>aaaaaa</li>
<li>bbbbbb</li>
<li>cccccc</li>
<li>dddddd</li>
<li>eeeeee</li>
<li>ffffff</li>
</ul>
<script>
var oLis = document.getElementsByTagName("li");//获取所有的li
//遍历给所有的li加事件
for(let i = 0;i < oLis.length;i ++){
oLis[i].onmouseover = function(){
this.style.background = "red";
}
oLis[i].onmouseout = function(){
this.style.background = "";
}
}
//事件委托(只需要给父类加事件就行了)
//这里要用要事件源:event对象.事件源,不管在哪个事件中,只要是你操作的那个元素就是事件源
var oUl = document.getElementById("ul1");//只需获取ul
oUl.onmouseover = function(evt){
var e = evt || window.event;
//兼容 event.target(标准浏览器) event.srcElement(IE)
var target = e.target || e.srcElement; //事件源
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
};
oUl.onmouseout = function(evt){
var e = evt || window.event;
//兼容
var target = e.target || e.srcElement;
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
};
//这里的事件冒泡是,鼠标滑过li冒泡后也滑过了ul,通过冒泡原理只需添加滑过ul的事件就行了 但这里的本身操作是发生在li上,所以事件源就是li
</script>
注:
onmouseenter 与 onmouseleave 是不存在冒泡
onmouseover 与 onmouseout 存在冒泡
1、通过触发事件时给处理函数所传递的第一个参数(evt),就是事件对象;(不兼容IE8及以下跟谷歌早期版本)
2、通过内置的全局对象:window.event来获取事件对象(只兼容IE9以下和谷歌早期版本)(IE9及以上不能用)
//兼容 var e = evt || window.event
一、事件流:(浏览器默认启动为事件冒泡)
(一)事件冒泡:由子节点依次向父节点,一直到祖先节点传递事件,这个过程称为事件冒泡。在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序(事件委托)或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。
阻止事件冒泡的方法
event.stopPropagation(); //标准
event.cancelBubble = true; //IE的方式
//兼容
event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;
(二)事件捕获:由祖先节点向子节点层层传递,传递到最底层的子节点,这个过程称为事件捕获;(IE不支持事件捕获)
捕获阶段是一个和冒泡阶段完全相反的过程,即事件由祖先元素向子元素传播,和一个石子儿从水底下沉一样,(要说明的是在IE、Opera浏览器中,是不存在这个阶段的。)从各个浏览器提供的注册事件监听的方法中可见一斑,例如适用于IE、Opera的attachEvent,有两个参数:attachEvent("on" + event,fn)(event代表事件名,如:"click"),二所谓的标准浏览器的addEventListener则有三个参数:addEventListener(event,fn,boolean),第三个参数boolean,就是决定注册事件发生在捕获阶段(true)还是冒泡阶段(false)。
二、事件委托机制
什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
利用冒泡的原理,把事件加到父级上,触发执行效果。
作用:提高性能
例如:
<ul>
<li>aaaaaa</li>
<li>bbbbbb</li>
<li>cccccc</li>
<li>dddddd</li>
<li>eeeeee</li>
<li>ffffff</li>
</ul>
<script>
var oLis = document.getElementsByTagName("li");//获取所有的li
//遍历给所有的li加事件
for(let i = 0;i < oLis.length;i ++){
oLis[i].onmouseover = function(){
this.style.background = "red";
}
oLis[i].onmouseout = function(){
this.style.background = "";
}
}
//事件委托(只需要给父类加事件就行了)
//这里要用要事件源:event对象.事件源,不管在哪个事件中,只要是你操作的那个元素就是事件源
var oUl = document.getElementById("ul1");//只需获取ul
oUl.onmouseover = function(evt){
var e = evt || window.event;
//兼容 event.target(标准浏览器) event.srcElement(IE)
var target = e.target || e.srcElement; //事件源
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
};
oUl.onmouseout = function(evt){
var e = evt || window.event;
//兼容
var target = e.target || e.srcElement;
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
};
//这里的事件冒泡是,鼠标滑过li冒泡后也滑过了ul,通过冒泡原理只需添加滑过ul的事件就行了 但这里的本身操作是发生在li上,所以事件源就是li
</script>
注:
onmouseenter 与 onmouseleave 是不存在冒泡
onmouseover 与 onmouseout 存在冒泡
阅读全文
0 0
- 事件流与事件委托
- DOM事件流与事件委托
- 事件绑定与事件委托
- 事件冒泡与事件委托
- 委托入门-事件与委托
- 事件委托、事件触发与事件冒泡
- 事件冒泡、事件捕获与事件委托
- 委托与事件
- 委托与事件
- c# 委托与事件
- 委托与事件
- 事件与委托详解
- 委托与事件详解
- 委托与事件详解
- 委托与事件
- C#委托与事件
- 委托与事件
- 委托与事件
- Mat类中的rowRange和colRange 提取某些行或列
- numpy入门1
- 笔试知识点
- Shell 函数
- 外卖小程序,适用于餐饮,蛋糕店,咖啡店,冷饮店,水果店,特产店,鲜花店-微信小程序视频教程29
- 事件流与事件委托
- numpy入门2
- 正确使用Android性能分析工具——TraceView
- 顺时针按层打印矩阵
- SQL中判断字符串中包含字符的方法
- jQuery文档处理 删除
- numpy入门3
- 在网站发布之后不需要修改默认文档
- Java--泛型浅谈