(1)event.currentTarget 事件的监听者 (2)event.target 事件的真正触发者 (3)event.srcElement IE浏览器的事件真正触发者,event.target===event.srcElement (true) (4)event.type 事件类型 (5)event.eventPhase 事件阶段
预备知识: element.addEventListener(eventName,fn(event),boolean) 将指定的监听器注册到 element上,当该对象触发指定的事件eventName时,指定的回调函数就会被执行; boolean 为false,事件在冒泡阶段被执行;boolean为true,事件在捕获阶段被执行。 举例解释:
<div id="A">A <div id="B">B</div> </div> a.addEventListener('click', function (e) { console.log(e.target); //事件的真正触发者 console.log(e.srcElement) //事件的真正触发者,IE的 console.log(e.currentTarget); //事件的监听者 console.log(e.type) //事件类型 console.log(e.eventPhase) //事件阶段 }, false);(1)如果点击A,结果为:
> <div id='A'>...</div> > <div id='A'>...</div> > <div id='A'>...</div> click 2 //即事件的真正触发者是A,因为A上有click事件,并且有鼠标有点击的操作; //事件的监听者是A,因为是给A注册的监听事件 //事件类型是 click,因为鼠标进行的是点击操作 //事件被触发的阶段,是在事件目标阶段2,因为事件的监听者和真正触发者都是A(2)如果点击B,结果为
<div id='B'>B</div>><div id='A'>...</div>click3 //即事件的真正触发者是B,因为B上有click事件,并且有鼠标点击的操作; //事件的监听者是A,因为是给A注册的监听事件 //事件类型是 click,因为鼠标进行的是点击操作 //事件被触发的阶段,是在事件捕获阶段3,因为事件从A开始监听,监听到B上的click事件被触发了,但是由于addEventListener第3参数false的设置,只在冒泡阶段被执行(3)事件机制总结:
假设有两个存在嵌套关系的divA>divB(divB被嵌套在divA中),divA注册了click点击事件(事件的监听者是A),事件设置在冒泡阶段(一般目标阶段也包括了)执行。那么, 如果鼠标点击了A,先在捕获阶段,事件流到了A,A监听到了click事件(因为给A设置了监听事件click),虽然A有click事件,但是在捕获阶段A上的事件处理函数也不会执行,然后依次向内传到B,B没有click事件,不执行事件处理函数,然后向外传;在冒泡阶段,事件流向A,A有click事件,相应的事件处理函数被执行。 规律: 1)事件执行存在3个阶段:事件捕获、事件目标、事件冒泡,一次事件只能出现2个阶段:捕获和目标,或者冒泡和目标,捕获和冒泡不可能同时出现。 2)不管在捕获阶段,还是在冒泡阶段,只要事件的监听者和真正触发者是同一个元素,那么事件阶段(event.eventPhase)处于目标阶段2,如果事件的监听者和真正触发者不是同一个,那么设置在什么阶段执行事件处理函数,event.eventPhase就是什么阶段。 3)注册事件的函数,称为事件处理程序或者事件侦听器。 4)元素的监听器,只能监听到嵌套在它里面的元素的鼠标操作,监听不到它外层的鼠标操作。 5)addEvent的事件处理函数中的this指向window;addEventListener,onclick,jQuery的click,on的事件处理函数中的this指向事件监听者(event.currentTarget) 6)onclick,jQuery中的on,click方法中的事件处理函数都是在事件阶段或者事件冒泡阶段执行。 7)W3c标准也提倡在事件冒泡阶段执行事件处理函数
新闻热点
疑难解答