1. 程式人生 > >事件及事件委托

事件及事件委托

需要 elb for 新增元素 turn 錨點 私有 nbsp prevent

每個元素身上的事件是天生自帶的,不需要我們去定義,只需要我們給這個事件綁定一個方法,當事件觸發的時候就會執行這個方法。

事件綁定的寫法

1.div.onclick=function(){}···DOM0級

2.div.addEventLostener()或div.attachEvent()···DOM2級

二者區別

onclick是這個元素的私有屬性,天生自帶的,而addEventLostener()是公有屬性

ie低版本的attachEvent()是公有的

div.onclick=function(){}存在事件冒泡機制沒有捕獲機制

div.addeventLostener()可有冒泡可有捕獲

div.attachevent()只有冒泡

div.addeventLostener()和div.attachWvent()區別

1.前者有冒泡和捕獲機制後者只有冒泡機制

2.事件名前者不帶on後者帶on

3.前者this指向當前元素,後者指向window

4.

arguments

每個函數都有一個arguments對象,他是這個函數所有參數構成的集合

每個事件的方法中瀏覽都給他一個參數叫mouseevent,我們所有鼠標的信息都臨時存儲在這個mouseevent對象上

mouseevent有兼容性

標準瀏覽器可以直接讀取,但是ie不行

解決方法

div.onclick=function(ev){

var ev=ev||window.event

}

event對象的兼容性

clientX和clientY是鼠標到瀏覽器左上角的距離

pageX和pageY是鼠標到頁面左上角的坐標,但是ie低版本沒有這個屬性

在ie下怎麽算clientY的值是用clientY+scrolltop

事件源 點擊那個元素,哪個元素就是事件源

標準瀏覽器的事件源是ev.target

ie6-8沒有這個屬性,但是ie有ev.srcelement

事件冒泡

1.event.cancelbubble=true

event.stopPropagation?event.stopPropagation():event.cancelbubble=true

阻止事件默認行為兼容性

比如a的href

href為空會自動刷新頁面

href為#錨點跳轉

href為javascript:;阻止默認行為發生

Event.preventDefault?Event.preventDefault():event.returnValue=false

事件委托

如果子元素身上綁定大量相同的事件,我們盡量采用事件委托,所有子元素把自己的事件委托給父級

原理:采用事件冒泡機制完成的

為什麽使用事件委托呢?

傳統的for循環綁定事件,會增加大量的dom操作(事件),影響頁面性能,采用事件委托就是把所有的事件基於一個元素

事件委托和傳統的事件綁定的優勢

傳統的事件綁定對新增元素不管用。事件委托對新增的元素起作用

傳統的事件綁定,有多少元素js就需要綁定多少事件,事件委托只需要一個事

事件及事件委托