事件對象:event
1.常用事件:onclick(點擊) onmouseenter(鼠標進入) onmouseover(鼠標懸浮) onmouseleave(鼠標離開) onfocus(表單聚焦) onblur(表單失去焦點) onmouseout(鼠標移出) onmousemove(鼠標移動) onmousedown(鼠標按下) onmouseup(鼠標抬起) onchange(表單內容修改) 瀏覽器加載完成(onload) 計數器(count)
2.每個元素身上的事件都是天生存在的,不需要我們去定義,只需要我給這個事件綁定一個方法,當事件觸發的時候,就會執行這個方法
3.事件綁定的寫法:
1.div.onclick=function(){} dom0級事件
2.div.addEventListener或者div.attachEvent dom2級事件
寫法上二者的區別
1.onclick這個元素的屬性是私有的 而 addEventListener()是公有的屬性 從EventTarget(事件源)繼承來的 ie低版本attachevent也是公有的
2.div.onclick存在事件冒泡機制,沒有捕獲
div.addEventListener可有冒泡,可有捕獲;
div.attachEvent 只有冒泡,沒有捕獲;
4.div.addEventListener和div.attachEvent的區別?
1.前者有冒泡和捕獲機制,后者只有冒泡機制;
2.事件名前者不帶on,后者帶on
3.前者this指向當前元素,后者指向window
4.前者是標准瀏覽器,后者ie8以下
案例:
var div=document.getElementById("div")
div.onclick=function(){
console.log(arguments)
}
上面控制台arguments數組有一個元素叫mouseevent
arguments(參數):
每個函數都有一個arguments對象,他是這個函數,所有參數構成的集合
所以每個事件的方法中瀏覽器都給它一個參數叫mouse event,我們所有的鼠標信息在這個mouse event上
1.event兼容性:聲明不一樣
標准瀏覽器聲明為undefined IE聲明為null 火狐無法識別(會報錯)
解決辦法:
div.onclick=function(ev){
var ev=ev||window.event
}
clientX和clientY的兼容性是鼠標離瀏覽器窗口左上角的坐標距離
pageX和pageY他是鼠標到網頁(文檔)左上角的距離坐標,但是IE低版本沒有這個屬性,在IE下怎么算pageY的值,用clientY+scrollTop
2.事件源,點擊哪個元素,哪個元素就是事件源
事件源的兼容:
標准瀏覽器的事件源是ev.target ie低版本(5-8)不識別這個屬性,但是ie有ev.srcElement這個屬性和target差不多
3.阻止事件冒泡的兼容性(之前的版本有,現在沒有了,僅供了解)
第一種:ie低版本的寫法為event.cancelBubble=true; 標准瀏覽器的寫法為:event.stoppropagation(現在標准瀏覽器也支持了event.cancel Bubble的寫法)
他的兼容性寫法為:event.stoppropargation?event.stopropagation:event.cancelBubble;
阻止事件默認行為的兼容性:
4.阻止事件默認行為的兼容性:
比如 a的href
href為空,會自動刷新頁面
href為#, 錨點跳轉
href為JavaScript:; 阻止默認行為的發生
(以上是a標簽阻止瀏覽器的默認行為,但也有別的事件會有默認行為)
標准瀏覽器:
event.preventDefault()
ie低版本的寫法:
event.retrunValue
兼容性的寫法為event.preventDefault()?event.preventDefaulf():event.returnValue;
事件委托:
委托就是利用事件冒泡(所有的dom操作離不開事件)
如果子元素身上綁定大量相同的事件,我們盡量采用事件委托,所有子元素把自己的子元素委托給父級
傳統的for循環綁定事件會增加大量的dom操作(事件)影響頁面性能,采用事件委托就把所有事件基於一個元素上
事件委托的原理:采用事件冒泡機制完成的
2.事件委托和傳統事件綁定的優勢?
傳統事件對新增元素不起作用,事件委托起作用
傳統事件綁定,有多少元素,js就綁定多少事件,事件委托,只需要一個事件
並不是所有事件都存在事件冒泡:
onmouseenter(鼠標進入) onmouseleave(鼠標離開)就沒有事件冒泡
所以我們做跟隨鼠標的時候,盡量用者兩個事件