JavaScript 事件是由訪問 Web 頁面的用戶引起的一系列操作。當(dāng)用戶執(zhí)行某些操作的時候,再去執(zhí)行一系列代碼?;蛘哂脕慝@取事件的詳細(xì)信息,如鼠標(biāo)位置、鍵盤按鍵
JavaScript 有三種事件模型:內(nèi)聯(lián)模型、腳本模型和 DOM2 模型。
內(nèi)聯(lián)模型
這種模型是最傳統(tǒng)接單的一種處理事件的方法。 在內(nèi)聯(lián)模型中, 事件處理函數(shù)是 HTML標(biāo)簽的一個屬性,用于處理指定事件。雖然內(nèi)聯(lián)在早期使用較多,但它是和 HTML 混寫的 ,并沒有與 HTML 分離。
腳本模型
由于內(nèi)聯(lián)模型違反了 HTML 與 JavaScript 代碼層次分離的原則。為了解決這個問題, 在 JavaScript 中處理事件。這種處理方式就是腳本模型。
事件處理函數(shù)
javaScript可以處理的事件類型為:鼠標(biāo)事件、鍵盤事件、HTML事件
所有的事件處理函數(shù)都會都有兩個部分組成,on + 事件名稱
鼠標(biāo)事件:
onclick:用戶單擊鼠標(biāo)按鈕或按下回車鍵時觸發(fā)
ondblclick:當(dāng)用戶雙擊主鼠標(biāo)按鈕時觸發(fā)
onmousedown:當(dāng)用戶按下鼠標(biāo)還未彈起時觸發(fā)
onmouseup:當(dāng)用戶釋放鼠標(biāo)按鈕時觸發(fā)
onmouseover:當(dāng)鼠標(biāo)移到某個元素上方時觸發(fā)
onmouseout:當(dāng)鼠標(biāo)移出某個元素上方時觸發(fā)
onmousemove:當(dāng)鼠標(biāo)指針在元素上移動時觸發(fā)?
鍵盤事件
onkeydown:當(dāng)用戶按下鍵盤上任意鍵觸發(fā),如果按住不放,會重復(fù)觸發(fā)。onkeypress:當(dāng)用戶按下鍵盤上的字符鍵觸發(fā),如果按住不放,會重復(fù)觸發(fā)onkeyup:當(dāng)用戶釋放鍵盤上的鍵觸發(fā)
HTML 事件
onload:當(dāng)頁面完全加載后在 window 上面觸發(fā),或當(dāng)框架集加載完畢后在框架集上觸發(fā)。
onselect:當(dāng)用戶選擇文本框(input 或 textarea)中的一個或多個字符觸發(fā)
onchange:當(dāng)文本框(input 或 textarea)內(nèi)容改變且失去焦點后觸發(fā)
onfocus:當(dāng)頁面或者元素獲得焦點時在 window 及相關(guān)元素上面觸發(fā)?
onblur:當(dāng)頁面或元素失去焦點時在 window 及相關(guān)元素上觸發(fā)
onsubmit:當(dāng)用戶點擊提交按鈕在<form>元素上觸發(fā)
onreset:當(dāng)用戶點擊重置按鈕在<form>元素上觸發(fā)
onresize:當(dāng)窗口或框架的大小變化時在 window 或框架上觸發(fā)
onscroll:當(dāng)用戶滾動帶滾動條的元素時觸發(fā)
什么是事件對象
當(dāng)觸發(fā)某個事件時,會產(chǎn)生一個事件對象,這個對象包含著所有與事件有關(guān)的信息 。包括導(dǎo)致事件的元素、事件的類型、以及其它與特定事件相關(guān)的信息
通過事件綁定的執(zhí)行函數(shù)是可以得到一個隱藏參數(shù)的 。說明,瀏覽器會自動分配一個參數(shù),這個參數(shù)其實就是 event 對象
直接接收 event 對象,是 W3C 的做法,IE 不支持,IE 自己定義了一個 event 對象,直接在 window.event 獲取即可。
input.onclick = function (evt) {
var oEvent = evt || window.event; //實現(xiàn)跨瀏覽器兼容獲取 event 對象
alert(oEvent );};
鼠標(biāo)事件
clientX 可視區(qū) X 坐標(biāo),距離左邊框的位置
clientY 可視區(qū) Y 坐標(biāo),距離上邊框的位置
screenX 屏幕區(qū) X 坐標(biāo),距離左屏幕的位置
screenY 屏幕區(qū) Y 坐標(biāo),距離上屏幕的位置
keyCode
??? 獲取用戶按下鍵盤的哪個按鍵
??? 例子:鍵盤控制Div移動
其他屬性?? ctrlKey、shiftKey、altKey
??? 例子:提交留言
??? 回車 提交???????? ctrl+回車 提交
??? 例子:? 只能輸入數(shù)字的輸入框
??? keydown、keyup事件的區(qū)別
默認(rèn)行為contextmenu
當(dāng)我們右擊網(wǎng)頁的時候,會自動出現(xiàn) windows 自帶的
菜單。那么我們可以使用 contextmenu 事件來修改我們指定的菜單,但前提是把右擊的默認(rèn)行為取消掉
阻止默認(rèn)行為
??? 普通寫法:return false;
事件冒泡,是從里往外逐個觸發(fā)。
事件捕獲,是從外往里逐個觸發(fā)。
阻止冒泡:
??? window.event? window.event.cancelBubble = true : oEvent.stopPropagation();
事件委托:利用冒泡的原理,把事件加到父級上,觸發(fā)執(zhí)行效果
好處
??? 1.提高性能
??? 2.新添加的元素,還會有之前的事件
event對象:事件源:不管在那個事件中,只要你操作的那個元素就是事件源
ie : window.event.srcElement? 標(biāo)準(zhǔn)下 :event.target
nodeName : 找到當(dāng)前元素的標(biāo)簽名
事件綁定分為兩種:一種是傳統(tǒng)事件綁定(內(nèi)聯(lián)模型,腳本模型),一種是現(xiàn)代事件綁定(DOM2 級模型)?,F(xiàn)代事件綁定在傳統(tǒng)綁定上提供了更強大更方便的功能。
W3C? 事件處理函數(shù)
“DOM2 級事件”定義了兩個方法,用于添加事件和刪除事件處理程序的操作:
addEventListener()和 removeEventListener()。所有 DOM 節(jié)點中都包含這兩個方法,并且它們都接受 3 個參數(shù);事件名、函數(shù)、冒泡或捕獲的布爾值(true 表示捕獲,false 表示冒泡)。
W3C 的現(xiàn)代事件綁定的特點 : 1.不需要自定義了;2.可以屏蔽相同的函數(shù);3.可以設(shè)置冒泡和捕獲。
IE? 事件處理函數(shù)
IE 實現(xiàn)了與 DOM 中類似的兩個方法:attachEvent()和 detachEvent()。這兩個方法接受相同的參數(shù):事件名稱和函數(shù)
IE 中的 this 的指向在這里會出錯,所以要使用window.event.srcElement。
區(qū)別:1.IE 不支持捕獲,只支持冒泡;
??????????2.IE 添加事件不能屏蔽重復(fù)的函數(shù);
??????????3.IE 中的 this 指向的是 window 而不是 DOM 對象。
????????? 4.在傳統(tǒng)事件上,IE 是無法接受到 event 對象的,但使用了 attchEvent()卻可以,但有些區(qū)別