事件
相關的知識都看無缺了事件處理程序函數在處理事件時,或者說DOM
在觸發某個事件的時候,會產生一個包含事件相關信息的event
事件對象javascript
對於不一樣瀏覽器環境,這個event
事件對象有一些差距html
不論是DOM0
級仍是DOM2
級html5
兼容DOM
的瀏覽器會將一個event
對象傳入事件處理程序中java
經常使用的event
對象的一些屬性瀏覽器
type
:表示事件的類型緩存
具體用法:能夠經過type
區分,在同一個事件處理函數實現多個事件的處理,減小事件監聽,優化性能dom
currentTarget
:事件處理程序當前正在處理這個事件的元素ide
target
: 表示實際觸發事件的DOM元素,實際目標函數
能夠這麼理解,body
下面的div
被點擊,冒泡到body
,在body
上綁定了一個click
事件,這個時候觸發這個body
的點擊事件,可是這個時候的target
其實是div
性能
那麼在事件處理程序中,還有一個this
屬性,還有一個currentTarget
:永遠指向正在處理這個事件的元素,那麼上一個例子中其實是body
在處理這個事件,因此currentTarget
是指向body
的
而 事件處理程序中的this
指向,是一直指向currentTarget
表示正在執行和處理事件的這個元素
因此,在事件沒有冒泡的狀況下,這三者是能夠爲同一個值,可是若是是在冒泡階段事件被處理的話,則這個target
可能不等於其餘兩個值
preventDefault
阻止默認行爲,是一個函數
用法:在須要阻止默認行爲的事件處理函數中,使用event.preventDefault()
,取消默認事件,好比默認點擊a
標籤會跳轉指定連接等等
注意: 只有event.cancleable
屬性爲true
的事件類型,纔可使用preventDefault
stopPropagation
阻止事件冒泡和捕獲,也是一個函數
eventPhase
獲取事件當前正處於事件流的哪一個階段
event.eventPhase
分別對應值:1,3,2上述event
屬性和方法,盡在事件處理程序執行期間存在,事件處理程序一旦執行完畢,會當即銷燬
IE中的event
對象跟DOM
中的事件對象有必定的差異,最重要的就是IE
中的事件對象,若是是使用DOM0
級的方法添加事件處理程序是,event
對象會掛載到window
下面?window?window?是的沒錯,獲取事件對象的時候,是經過window.event
來拿到事件對象,若是使用html
指定事件處理程序或者是DOM2
級都都不會有這個問題,和DOM
級別相似,會有一個event
對象傳入到事件處理程序
可是IE
中的事件對象,對應的屬性名和方法名跟DOM
中事件對象的名字有很大不同
cancelBubble == stopPropagation
阻止事件冒泡,可是不是個方法是一個屬性returnValue == preventDefault
阻止默認事件,可是不是個方法,是一個屬性srcElement == target
實際觸發目標type == type
用來區分事件類型,這個沒有區別要記住的仍是,若是在IE
環境下,使用DOM0
級指定事件處理程序的話,獲取event
對象須要從window.event
這樣獲取
例如:
var btn= document.getElementById('test') // DOM0級指定 btn.onclick=function(){ alert(window.event.target.srcElement === this) //true } // DOM2級 btn.addEventListener('click',function(event){ alert(event.srcElment === this) //true })
還有就是IE
環境下阻止事件冒泡和默認處理程序都是屬性,不是方法,只須要把對應的屬性設置爲false
例如:
var link = document..getElementById('test') link.onclick = function(){ window.event.returnValue = false; //阻止默認事件 }
IE
中的cancleBuble只是取消冒泡,由於IE環境不支持事件捕獲,哈哈哈哈
而後就是完善一下以前的EventUtil
,實現跨瀏覽器的獲取事件對象,還有阻止冒泡和默認事件處理程序,代碼以下
getTarget(event){ return event || window.event //IE環境下多是WINDOW.event }, preventDefault(event){ if(event.preventDefault){ event.preventDefault() }else{ event.returnValue = false // IE環境下沒有preventDefault,是經過設置returnValue取消默認 } }, stopPropagation(event){ if(event.stopPropagation){ event.stopPropagation() }else{ event.cancelBuble = false } }
DOM3級完善了事件類型,用來區分事件類型的不一樣信息,相似:鼠標事件,焦點事件,鍵盤事件,文本時間,滾輪事件等等
指的是那些不必定與用戶操做有管的事件,包括一些DOM和元素的交互時間,例如load
事件 unload
事件
load
事件
window
,DOM2
級寫法:監聽window
對象,例如window.addEventListener('load',function(){})
HTML
級寫法,因爲HTML
寫法沒法拿到window
對象,因此會直接寫在body
上面,通常來講,在window
上發生的任何事件均可以在body
元素上經過對應的特性來指定,全部的瀏覽器都能很好地支持這種方式,可是任然推薦使用DOM0
或DOM2
等javascript
的方法來綁定window
對象的時間按處理程序img,script,link,video
等標籤也有load
事件unload
事件
window
resize
事件
DOM
瀏覽器和IE
環境有區別,event.target
屬性的實際觸發對象不同,在DOM
瀏覽器中,這個屬性指向document
,可是在IE
環境中,這個值沒有指定firefox
瀏覽器,resize
的過程不會持續觸發這個事件,只在開始和結束,兩個觸發,而在其餘瀏覽器,在拖拽的過程當中是會一直觸發這個事件window
1px
的改變時候,最大最小化窗口的時候load
事件,能夠用window
對象捕獲,也能夠用body
標籤捕獲scroll
事件
window
load
方法相似document.compatMode
渲染模式,有不一樣的表現,在compatMode==='CSS1Copat'
標準模式時,除了Safari
瀏覽器,全部的都會經過html
這個元素反應這個變化,而在混雜模式時,是經過body
元素的scrollLeft
和scrollTop
來獲取這個具體的bian'hua數值,而如今基本上混雜模式和標準模式已經混合了,區分沒有這麼詳細在頁面元素失去或者得到焦點的時候觸發,能夠用來知曉用戶在頁面上的行蹤
主要用的比較多的是
focus
,blur
,這兩個事件表示,元素得到焦點和失去焦點,不會冒泡
focusin,focusout
用來表示焦點進入和焦點失去事件,**這兩個事件會冒泡
雖然上述經常使用事件有的不會冒泡什麼,可是,仍然會走捕獲階段,因此仍然能夠經過捕獲階段進行一些外級操做,固然是瀏覽器支持捕獲階段
觸發元素:全部元素均可觸發
捕獲方式:DOM0
級,DOM2
級,或者HTML
方法都可捕獲,IE
瀏覽器環境方式也能夠
鼠標和滾輪事件也是在DOM3
級事件中定義的,主要有,單擊,點擊,雙擊,鼠標移入,鼠標移出,等
除了鼠標移入mouseenter
和鼠標移除mouseleave
全部的鼠標事件都會冒泡,也是能夠取消的,而取消鼠標事件將會影響瀏覽器的默認行爲,取消鼠標事件的默認行爲還會影響其餘事件,由於鼠標事件可能和其餘事件是有聯繫的
一個click
事件,前面包括了一個鼠標按下mousedown
和鼠標放開兩個事件mouseup
,也就是觸發click
事件前會先觸發前兩個事件
同理,雙擊事件doubleclick
事件包括兩個click
事件,前面又有兩個mouseup
和mousedown
事件
主要用處
event.clientX
和event.clientY
event.pageX
和event.pageY
event.screenX
和event.screenY
ctrl
,alt
等)
shift
鍵 就在 event.shiftKey
這個屬性上event.relatedTarget
mouseout
和mouseenter
時表示 目標獲取光標元素和目標失去光標元素IE8
以前的沒有這個屬性,可是分別有兩個fromElment
和toElement
用來獲取這兩個相關元素button
0 : 左鍵按下,1:中鍵按下,2:右鍵按下
IE8
及更早版本瀏覽器也有這個屬性,可是對應值有比較大的區別,區分的更爲細緻detail
dblclick
事件,雙擊會放大畫面,並且不能改變該行爲mousemove
事件,若是此事件會致使內容變化,將再也不發生其餘事件,若是不會觸發任何事件,那麼依次會發生mousedown,mouseup,click
事件,可點擊單元表示一些會產生默認操做的元素:好比a
標籤主要是一些鍵盤輸入和文本鍵入的事件,是說DOM2
級事件最初規定了鍵盤事件,可是後來刪掉了,因此目前主要支持的仍是DOM0級
事件和DOM3
級事件,可是DOM3
級事件暫時沒有特別完善
主要事件keydown
,keypress
,keyup
,理論上全部的元素都支持這三個事件,可是實際上只有文本輸入框支持最多
觸發順序keydown,keypress,keyup
,而且keydown
和keypress
都是在文本框發生變化以前觸發,而keyup
事件則是在文本框已經變化以後觸發,若是用戶一直按住一個字符不放,則會一直觸發keydown
和keypress
事件
還有一個新增的文本事件textInput
,其實是對keypress
的補充,用意是將文本顯示給用戶以前更加容易攔截文本,在文本插入文本框以前會觸發textInput
事件
經常使用鍵盤事件屬性
keyCode
keydown
和keyup
時,event對象會有一個keyCode
屬性charCode
keypress
事件觸發時charCode
是否可用,若是有的話則表示的是 按下鍵對應字符的ASCII碼,而IE8
及更早版本,則是在keyCode
表示字符對應的ASCII碼charCode
,在IE8
及老舊瀏覽器也可能在keyCode
charCode
可用的話,能夠經過字符串類方法String.fromCharCode
轉化爲實際的字符char
和key
charCode
和keyCode
key
:表示對應的文本字符,包括大小寫,就是實際的鍵入字符char
:表現形式在按下字符時表現和key
一致,可是對於非字符時,char
爲null
location
屬性,表示按下了鍵盤什麼位置的同一個按鍵,例如鍵盤左邊的shift
和右邊的shift
inputMethod
,用來區分輸入方式,是複製進來的,仍是拖放進來的,仍是手寫輸入,語音輸入等DOM3級的鍵盤輸入事件很美好,可是不知道實際支持狀況,並且還要作兼容,以前遇到一個number
類型的input
輸入框,就累個夠嗆,候選字等,輸入法越作越優秀,事件愈來愈複雜
是DOM3
級新增的一類事件,用域處理IME
的輸入序列,暫時沒接觸,也是一類多功能輸入事件吧
是DOM2
級的變更事件
表示:DOM中某一部分發生變化時給出提示,變更事件是爲XML
或者HTML DOM
設計的,並不特定於某種語言。
主要有:
contextmenu
上下文菜單事件
beforeunload
事件
window
對象DOMContentLoaded
事件
DOM
樹完整造成以後觸發window
對象readystatechange
事件
script
標籤等readystate
的狀態屬性,會有如下狀態(但不是全部狀態都會正常變化)
uninitialized
未初始化狀態loading
正在加載loaded
加載完畢interactive
能夠操做對象complete
完成pagehide
和pageshow
事件
load
事件,不會從新加載頁面,只是從頁面回顯event.persisted
是否被緩存在bfcache
中window
。。。太多了,還有好多事件類型,回頭再填坑了,記錄不下去了