最近在复习一些基础的知识。 尤其是当时看的时候就不是很明白的东西,现在再看一遍,有一种豁然开朗的感觉。
浏览器中的事件,大部分的问题都会集中在IE和其他系浏览器之前的差异。
####两种事件机制 要想理解这种差异,就要了解Bubbling
和Capturing
这两种事件机制。
所谓Bubbling
,就是俗称的冒泡
机制;所谓的Capturing
,就是俗称的捕获
机制。
下面以一个简单的结构作为说明:
<body>
<div id="box">
<button id="button">click</button>
</div>
</body>
在这个结构中,点击button
。
在Bubbling
机制下,事件是从button
逐级向外层元素传播,形象的比喻为冒泡
。假设我给button
和box
都绑定了事件回调,那么事件回调执行的顺序是buttonHandler
,boxHandler
。
在Capturing
机制下,事件是从document
一直向被选中的元素传递,直到传到被选中的元素为止。还是假设给button
和box
都绑定了事件回调,那么事件回调的执行顺序是boxHandler
,buttonHandler
。
通俗的说,就是一个(Bubbling)是由内向外,另一个(Camturing)是由外向内。
####浏览器差异
在非IE浏览器中,事件都是通过addEventlistener(eventName,callback,isCapturing)
这种方式来绑定的。最后一个isCapturing
参数,是用来选择是否使用Capturing
机制来处理事件。通常来说,这个参数都会使用默认的false
,也就是不使用Capturing
的方式来处理事件。
但是在IE浏览器中,事件都是通过attachEvent(eventName,callback)
的方式来绑定的,可以看到在这个方法中,没有给使用者留参数,选择是使用Bubbleing
和Capturing
。所以呢,IE浏览器在这里就给大家留了个坑 : 在IE浏览器中,事件处理都是使用Bubbling机制来处理的。
除此之外,在整个事件处理的流程中,非IE浏览器的callback
里,this
会指向当前触发事件的元素;但是在IE浏览器中,this
会指向window.event
这个全局的变量中。
所以,如果要想在IE浏览器中获取到当前触发事件的元素,还需要到window.event
中去取值。
另外,在非IE浏览器中,如果想要取消事件的默认方法,可以通过evn.preventDefault()
来完成;但是在IE浏览器中,只能通过window.event.returnValue = false
来完成。