JavaScript學習13:事件繫結
事件繫結分為兩種:一種是傳統事件繫結(內聯模型、指令碼模型),一種是現代事件繫結(DOM2級模型)。現代事件繫結在傳統繫結的基礎上為我們提供了更強大更方便的功能。
傳統事件繫結的問題
因為內聯模型很少用,這裡不做討論。先來看一下指令碼模型,將一個函式賦值給一個事件處理函式。
<span style="font-size:18px;">var box=document.getElementById('box');
box.onclick=function(){
alert('Lian');
};
box.onclick=function(){
alert('Jiang');
};</span>
如此繫結事件有很多的問題,具體如下:
1一個事件處理函式觸發兩次事件,後面的一個會把 前一個完全覆蓋掉
<span style="font-size:18px;">box.onclick=toBlue;
function toRed(){
this.className='red';
this.onclick=toBlue;
}
function toBlue(){
this.className='blue';
this.onclick=toRed;
}</span>
2事件切換器,在進行擴充套件的時候,會出現三個問題:覆蓋,可讀性降低、this傳遞問題。
編寫自定義事件處理函式,還有一個問題,那就是兩個相同函式名的函式誤註冊了多次,那麼應該把多餘的遮蔽掉。這樣自定義的話,就比較麻煩了。
W3C事件處理函式
DOM2級事件定義了兩個方法,用於新增事件和刪除事件處理程式的操作:addEventListener()和removeEventListener()。所有DOM節點中都包含這兩個方法,並且它們都接受3個引數:事件名、函式、冒泡或捕獲的布林值(true表示捕獲,false表示冒泡)。
<span style="font-size:18px;">window.addEventListener('load',init,false);
window.addEventListener('load',init,false);
function init(){
alert('Lian');
}</span>
相比較我們自定義的好處有:1不需要自定義了 2 可以遮蔽掉相同的函式 3 可以設定冒泡和捕獲。
IE事件處理函式
IE實現了與DOM中類似的兩個方法:attachEvent和detachEvent。這兩個方法接受相同的引數:事件名和函式。
IE中事件處理函式有很多區別,相對於W3C的DOM而言:1.IE不支援捕獲,只支援冒泡 2.IE新增事件不能遮蔽重複的函式;3.IE中的this指向的是window而不是DOM物件;4.在傳統事件上,IE是無法接受到event物件的,但是使用了attchEvent之後就可以。
鑑於IE中事件繫結函式有諸多問題,因此在實踐中不去使用。
事件物件的其他補充
在W3C中提供了一個屬性:relatedTarget,這個屬性可以在mouseover和mouseout事件中獲取從哪裡移入和從哪裡移出的DOM物件。
IE提供了兩組分別用於 移入移出的屬性:fromElement和toElement,分別對應mouseover和mouseout。
<span style="font-size:18px;">function getTarget(evt){
var e=evt||window.event;
if(e.srcElement){
if(e.type=='mouseover'){
return e.fromElement;
} else if(e.type=='mouseout'){
return e.toElement;
}
}else if(e.relatedTarget){
return e.relatedTarget;
}
}</span>
小結一下:對於JavaScript的事件學習就暫時告一段落了,用了三篇部落格對事件進行學習和總結,可見這塊的內容是比較重要的,雖然瞭解了大致的內容,但是對一些細節的東西還沒有掌握,期待在以後的專案實踐中加以學習和深化。
相關文章
- JavaScript學習筆記10: 事件繫結&監聽JavaScript筆記事件
- JavaScript 事件繫結JavaScript事件
- JS學習之事件和事件繫結JS事件
- javascript設計模式(張容銘)學習筆記 – 外觀模式繫結事件JavaScript設計模式筆記事件
- 【測試平臺開發】Vue指令、屬性繫結、事件繫結學習教程Vue事件
- 事件繫結事件
- JavaScript學習筆記13JavaScript筆記
- JSX繫結事件JS事件
- js on繫結事件JS事件
- 學習筆記八:vue之事件繫結加不加括號筆記Vue事件
- Hooks與事件繫結Hook事件
- JS-事件繫結JS事件
- Vue事件繫結原理Vue事件
- 繫結自定義事件事件
- v-on 繫結事件事件
- Silverlight 2 學習筆記之事件的重複繫結問題筆記事件
- [JavaScript] 事件委託以及 Vue 列表迴圈事件繫結的效能最佳化JavaScript事件Vue
- python tkinter如何繫結事件?Python事件
- React事件繫結的方式React事件
- React事件優雅繫結React事件
- 元件繫結原生事件元件事件
- IOS繫結touchend事件失效iOS事件
- JS的事件繫結和事件流模型JS事件模型
- zepto繫結事件改變冒泡事件流事件
- JavaScript this 繫結規則JavaScript
- 學習JavaScript非同步、事件迴圈JavaScript非同步事件
- JavaScript學習小結JavaScript
- jQuery事件中on實現繫結多個事件jQuery事件
- 080 元件自定義事件-繫結元件事件
- 微信小程式事件繫結微信小程式事件
- Swoole 使用on()繫結事件報錯事件
- 陪你一起學習之javascript事件JavaScript事件
- Vue事件獲取觸發事件物件和繫結事件物件Vue事件物件
- JS給全域性繫結事件以及給除某個元素外的其他元素繫結事件JS事件
- echarts 繫結事件處理函式Echarts事件函式
- jQuery之_事件繫結與解綁jQuery事件
- JavaScript keydown事件總結JavaScript事件
- JavaScript中this的繫結規則JavaScript
- KnockoutJS學習筆記14:KonckoutJS click繫結JS筆記