JavaScript之坑了我--事件繫結原理
html元素事件繫結共兩種方式:
(1)行內式:
<--input type="”button”" data-ke-onclick="”alert(‘haha!’);”/">
注意:原來事件處理過程可以相當於一個函式的執行語句;
-- <--input type="button" data-ke-onclick="
alert('luozhixiao');
var arr2 = [['luozhixiao',22,'huazhou'],['limeisheng',44,'meizhou']];
for(var i in arr2){
for(var j in arr2[i]){
console.log(arr2[i][j]);
}
}
"/>
(2)動態繫結:(目前做專案最流行的方式:元素、樣式、事件分離,解耦!!!)
function myAlert(){
alert("dianjile");
}
document.getElementById("btn1").onclick = myAlert;
原理注意:
這種其實是:物件obj的屬性onclick被賦值了:
Obj . onclick = myAlert ; //即: Obj . onclick();
即瀏覽器監聽這個html元素上的事件,一旦發生“點選”,則執行onclick();
不要寫成了:document.getElementById("btn1").onclick = myAlert();這樣加了括號的話,變成了瀏覽器執行到這一行時,先執行myAlert(),然後將此函式的返回值賦給onclick事件。
當然如果真的遇上奇葩需求,可以象下面這樣:
var i = 0;
function myAlert(){//根據條件判斷應該返回哪個函式
if(i == 0){
return function(){alert(“條件不足,無法登入!”) ; } ;
}else{
return function(){alert(“條件充足,請登入!”) ; } ;
}
}
document.getElementById("btn1").onclick = myAlert();這樣的話,myAlert()執行後返回值就為一個函式。
(3)新增事件監聽:當同一個html元素的同一個事件需要新增多個函式時使用。
相容性注意:
基於IE核心的瀏覽器:attachEvent(eventName , callback);僅僅支援冒泡模型
基於W3C標準的瀏覽器:addEventListener(eventName , callback,capture);
當capture ==false , 預設值:冒泡模型;
當capture == true , 捕捉模型;
注意:低版本的IE核心瀏覽器不支援addEventListener僅支援attachEvent,而且只支援冒泡模型,而且先繫結的function後執行(即倒序執行),事件名稱需要“on”字首。所以程式設計時要注意相容性的問題。
(1)document.getElementById("btn1").attachEvent("onclick",fn1); //冒泡模型
document.getElementById("btn1").attachEvent("onclick",fn2); //冒泡模型
//倒序執行:先執行fn2,再執行fn1
(2)document.getElementById("btn1").addEventListener("click",fn1,false);//冒泡模型
document.getElementById("btn1").addEventListener("click",fn2,true);//監聽模型
//正序執行。(還是這樣比較符合我們人類的思維吧!)
然而,為了解決相容性問題,我們可以這樣:
事件監聽時的相容性問題統一解決方案:jquery原始碼實現也是如此。
function addEvent(obj , type , eventName){
if(window.attachEvent){//如果是基於IE
obj.attachEvent("on"+type,eventName);
}else{//如果是基於W3C
obj.addEventListener(type,eventName);
}
}
function fn1(){alert("fn1執行...");}
function fn2(){alert("fn2執行...");}
addEvent(document.getElementById("btn1"),"click","fn1");
addEvent(document.getElementById("btn1"),"click","fn2");
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1822652/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript之坑了我--事件模型細節JavaScript事件模型
- JavaScript之坑了我--閉包原理不過如此JavaScript
- JavaScript 事件繫結JavaScript事件
- JavaScript之坑我--陣列原理探析JavaScript陣列
- Vue事件繫結原理Vue事件
- JavaScript之坑了我--BOM模型速知JavaScript模型
- JavaScript之坑了我--定時器用法JavaScript定時器
- JavaScript之坑了我--函式細節JavaScript函式
- JavaScript之坑了我--物件導向預熱JavaScript物件
- JavaScript之坑了我--JSON物件明析JavaScriptJSON物件
- JavaScript學習13:事件繫結JavaScript事件
- javascript基礎(事件的繫結)(三十四)JavaScript事件
- 繫結事件事件
- 事件繫結事件
- jQuery原始碼剖析(五) - 事件繫結原理剖析jQuery原始碼事件
- jQuery之_事件繫結與解綁jQuery事件
- App Framework框架之繫結事件(1)APPFramework框架事件
- JavaScript之坑了我--instanceof的判斷機制測試JavaScript
- JavaScript之坑了我--閉包助力OOP之模擬私有成員屬性JavaScriptOOP
- JavaScript之坑了我--一張圖看盡原型及底層模擬JavaScript原型
- js on繫結事件JS事件
- jQuery繫結事件jQuery事件
- JavaScript學習筆記10: 事件繫結&監聽JavaScript筆記事件
- Vue3 初體驗(中),巨坑的事件繫結Vue事件
- 少踩點坑,你值得知道的React事件繫結React事件
- 模板語法之--強制資料繫結和繫結事件監聽事件
- 前端基礎之原生js事件繫結案例前端JS事件
- javascript事件處理函式繫結簡單介紹JavaScript事件函式
- 繫結自定義事件事件
- v-on 繫結事件事件
- Hooks與事件繫結Hook事件
- 2.事件繫結事件
- JSX繫結事件JS事件
- JS-事件繫結JS事件
- 我們都會知道的Javascript:this的繫結規則JavaScript
- [JavaScript] 事件委託以及 Vue 列表迴圈事件繫結的效能最佳化JavaScript事件Vue
- MyBatis介面繫結原理MyBatis
- 資料繫結原理