javascript 事件的冒泡 (IE浏览器支持)
一.在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)
如:
当点击子集元素two时触发onclick事件运行函数,但是运行完two()后并没有停止,他会触发父级元素onclick事件,运行函数one(),与自己本意不同,事件函数运行方式依次从最小子集元素向外触发同一onclick事件,就像水中的气泡,一点一点往上冒泡,所以叫事件冒泡。
二、需要注意什么
1.事件捕获其实有三种方式,事件冒泡只是其中的一种:(1)IE从里到外(inside→outside)的冒泡型事件。(2)Netscape4.0从外到里(outside→inside)的捕获型事件。(3)DOM事件流,先从外到里,再从里到外回到原点(outside→inside→outside)的事件捕获方法(似乎对象将触发两次事件处理,这有什么作用?鄙人不懂!)。
2.不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload。
3.事件捕获方式在不同浏览器,甚至同种浏览器的不同版本中是有所区别的。如Netscape4.0采用捕获型事件解决方案,其它多数浏览器则支持冒泡型事件解决方案,另外DOM事件流还支持文本节点事件冒泡。
4.事件捕获到达顶层的目标在不同浏览器或不同浏览器版本也是有区别的。在IE6中HTML是接收事件冒泡的,另外大部分浏览器将冒泡延续到window对象,即……body→documen→window。
5.阻止冒泡并不能阻止对象默认行为。比如submit按钮被点击后会提交表单数据,这种行为无须我们写程序定制。
三.阻止冒泡行为
|
|
JavaScript 事件的捕获 (非IE浏览器支持)
一.事件捕获与事件冒泡触发事件的顺序相反,它在同一事件下,从父级向子集元素,一级一级向下,触发事件。
阻止事件的捕获
|
|
DOM事件流
一.DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流
DOM同时支持两种事件模型: 捕获型事件和 冒泡型事件,但是,捕获型事件先发生。两种事件流会触发DOM中的所有对象,从 document对象开始,也在document对象结束。
DOM事件模型的最独特的性质是,文本节点也触发事件(在IE中不会)
DOM2级事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。
在DOM事件流中,实际的目标在捕获阶段不会接收到事件。这意味着在捕获阶段,事件从document到再到
多数支持DOM事件流的浏览器都实现了一种特定的行为;即使”DOM2级事件”规范明确要求捕获阶段不会涉及事件目标。但IE9+、Safari、Chrome、Firefox、Opera都会在捕获阶段触发事件对象上的事件。结果,就是有两个机会在目标对象上面操作事件。(IE8-浏览器不支持事件流)
javascript 事件的监听
1、当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的onclick事件发生时,只会执行最后绑定的方法。而用事件监听则不会有覆盖的现象,每个绑定的事件都会被执行。如下:
2、采用事件监听给对象绑定方法后,可以解除相应的绑定,写法如下:
对函数进行封装后的监听事件如下,兼容各大主流浏览器。:
javascript 事件的委托
1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。
好处呢:1,提高性能。
我们可以看一个例子:需要触发每个li来改变他们的背景颜色。
这样我们就可以做到li上面添加鼠标事件。
但是如果说我们可能有很多个li用for循环的话就比较影响性能。
下面我们可以用事件委托的方式来实现这样的效果。html不变
好处2,新添加的元素还会有之前的事件。
我们还拿这个例子看,但是我们要做动态的添加li。点击button动态添加li
如:
不用事件委托我们会这样做:
这样做我们可以看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。
因为点击添加的时候for循环已经执行完毕。
那么我们用事件委托的方式来做。就是html不变
javascript 事件的绑定
传统方式
|
|
1.传统绑定的优点:
非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致
处理事件时,this关键字引用的是当前元素,这很有帮组
2.传统绑定的缺点:
传统方法只会在事件冒泡中运行,而非捕获和冒泡
一个元素一次只能绑定一个事件处理函数。新绑定的事件处理函数会覆盖旧的事件处理函数
事件对象参数(e)仅非IE浏览器可用
W3C方式
|
|
1.W3C绑定的优点
该方法同时支持事件处理的捕获和冒泡阶段。事件阶段取决于addEventListener最后的参数设置:false (冒泡) 或 true (捕获)。
在事件处理函数内部,this关键字引用当前元素。
事件对象总是可以通过处理函数的第一个参数(e)捕获。
可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件
2.W3C绑定的缺点
IE不支持,你必须使用IE的attachEvent函数替代。
IE方式
|
|
1.IE方式的优点
在传统绑定上,IE 是无法像 W3C 那样通过传参接受 event 对象,但如果使用了attachEvent()却可以
|
|
可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件。
2.IE方式的缺点
IE仅支持事件捕获的冒泡阶段
事件监听函数内的this关键字指向了window对象,而不是当前元素(IE的一个巨大缺点)
事件对象仅存在与window.event参数中
事件必须以ontype的形式命名,比如,onclick而非click
仅IE可用。你必须在非IE浏览器中使用W3C的addEventListener