js事件机制

来源:互联网 发布:外星人学物理2淘宝网 编辑:程序博客网 时间:2024/06/06 18:35

1、事件和事件流

js和html之间的交互,通过事件来实现。事件的起源,主要是为了分担服务器运算负载的一种手段。DOM2级规范的标准DOM事件是符合逻辑的标准化的。IE9、Firfox、Opera、Safira和Chrome已经全部实现了DOM2级事件模块的核心模块。事件,就是文档或者浏览器窗口中发生的一些特定交互瞬间。那么事件是如何被触发的,也就是说它什么时候执行,这就是事件机制问题。netscape和微软曾事件的触发有各自的争议,netscape认为,通过捕获方式,触发事件;微软主张通过冒泡方式触发事件。后来w3c采用折中处理方式,制定了同一的标准--先捕获再冒泡。所以事件被触发分为3个阶段:事件捕获,目标阶段(正在执行当前对象的事件处理程序),事件冒泡。DOM2级事件流图:

这里写图片描述

2、事件对象

(1)event.currentTarget 事件的监听者
(2)event.target 事件的真正触发者
(3)event.srcElement IE浏览器的事件真正触发者,event.target===event.srcElement (true)
(4)event.type 事件类型
(5)event.eventPhase 事件阶段

3、事件执行过程(事件机制)

预备知识:
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标准也提倡在事件冒泡阶段执行事件处理函数

4、阻止事件冒泡

有时候,我们会遇到这样的情况,元素A嵌套了元素B,元素B嵌套了元素C,同时给ABC注册了click事件,但是要求当点击C时,只允许C上的处理函数执行,不允许A和B上的处理函数执行,这时,就需要阻止事件冒泡。方法有:
//IE 阻止事件冒泡window.event.cancelBubble = true // event不是事件处理函数中的event// 火狐阻止事件冒泡e.stopPropagation()  //e为事件处理函数中的e//谷歌 以上两种方法均可以
0 0
原创粉丝点击