javascript下對(duì)于事件、事件流、事件觸發(fā)的順序隨便說說
事件: 事件是用戶自身或?yàn)g覽器進(jìn)行的特定行為。如:用戶點(diǎn)擊 也就是常用的click事件
事件流:多個(gè)事件 按一定順序觸發(fā) 形成了事件流
事件名稱:如上面所講的click就是事件名
事件處理函數(shù)/事件監(jiān)聽函數(shù)(Dom的叫法)就是 事件觸發(fā)后的處理函數(shù),如obj.onclick=fn;函數(shù)fn就是事件處理函數(shù)
2.下面我們來了解一下歷史,事件是dom的一部分 是在版本3中已經(jīng)得到完整的說明,當(dāng)進(jìn)瀏覽器除ie(它有自己的事件模型),其他像netscape,safari,opera都基本上遵守dom的事件模型
3. 冒泡事件,其基本思想是事件從特定的事件目標(biāo)向非特定的事件目標(biāo)順序觸發(fā)。
先看如下代碼:代碼
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
<title>無標(biāo)題頁</title>
</head>
<body onclick="handleClick()">
<div onclick="handleClick()">click me</div>
</body>
</html>
在ie5.5其冒泡順序如下圖
在ie6.o以上增加了html(為了兼容,最后避免在此標(biāo)簽上添加事件) 如圖:
而在Mozilla 1.0中的冒泡事件是:
三種其實(shí)順序沒什么不同,只是有部分標(biāo)簽是否支持冒泡的差異
4.我們?cè)倏?捕獲事件
ie4.0使用的是冒泡事件,而netscape navigator使用的是捕獲型事件如下圖所示:
、
5.ie只支持冒泡事件,而dom是同時(shí)支持“ 冒泡事件和捕獲事件的 ”,順序是:”捕獲事件”-----》》“冒泡事件” ,前面我們已經(jīng)講了moz,opera,safari等瀏覽器基本上是符合dom事件模型的,所以他們也支持“ 冒泡事件和捕獲事件的 ”,如下圖:
6.下面我們了解 怎樣為標(biāo)簽添加事件,最常用的方法是在其標(biāo)簽里面添加如 一下代碼(這種添加,在moz中只有“捕獲事件”,等價(jià)于用addEventListener(obj,type,false)添加的函數(shù),這個(gè)后面再講):
例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>無標(biāo)題頁</title>
</head>
<body onclick="alert('body')">
<div onclick="alert('div');">
div
<input id="Button1" onclick="alert('btn');" type="button" value="button" />
</div>
</body>
</html>
點(diǎn)擊 按鈕 在ie中,依據(jù)我們對(duì)上面的了解,很容易寫出答案了,沒錯(cuò)!ie只有冒泡事件 所以 順序?yàn)椋篵utton>>div>>body;
而在非ie瀏覽器如moz中 正如我們上面所說的 內(nèi)嵌式事件 等價(jià)于addEventlistener(type,fn,false) 只從捕獲事件中 監(jiān)聽。
所以順序剛好相反 body>>div>>body;
在addEventlistener(type,fn,true添加事件時(shí)) 只監(jiān)聽 “捕獲事件” 當(dāng)?shù)谌齻€(gè)參數(shù)為false時(shí) 只監(jiān)聽 冒泡事件
我們看下面一個(gè)例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
<title>無標(biāo)題頁</title>
<style type="text/css">
#ll{ background:#f00; _width: expression(this.width>200?"200px":true);}
</style>
</head>
<body id="obj1">
<div id="obj2"><input id="obj3" id="Text1" type="text" /></div>
<script language="javascript" type="text/javascript">
var $=function(eid){
return typeof eid=="object"?eid:document.getElementById(eid);
};
var fn={
fn1:function(){alert("body");},
fn2:function(){alert("div");},
fn3:function(){alert("test");}
};
var et={};
et.addEvent=function(obj,type,fn,flag){
if(obj.attachEvent){
obj.attachEvent("on"+type,fn);
}else if(obj.addEventListener){
flag=(typeof flag!="undefined")?flag:true;
obj.addEventListener(type,fn,flag);
}else{
obj["on"+type]=fn;
}
};
et.addEvent($("obj1"),"click",fn.fn1,true);
et.addEvent($("obj2"),"click",fn.fn2,false);
et.addEvent($("obj3"),"click",fn.fn3,true);
// et.addEvent($("obj3"),"click",fn.fn3);
// et.addEvent($("obj2"),"click",fn.fn2);
// et.addEvent($("obj1"),"click",fn.fn1);
</script>
</body>
</html>
點(diǎn)擊文本域,猜一猜分別在ie和moz(火狐)中的區(qū)別,當(dāng)然在ie中由于 只監(jiān)聽 冒泡事件 所以很好判斷 執(zhí)行順序?yàn)椋篿nput>>div>>body
而在moz中 由于div在添加事件時(shí) 第三個(gè)參數(shù)為false 說明div只 監(jiān)聽 冒泡事件,然后我們根據(jù)dom的事件 模型 不難判斷,先是ojb1>>obj3>>obj2
分別彈出 body>> test >>div
順便嘮叨一下:向同一個(gè)標(biāo)簽 動(dòng)態(tài)的添加事件是 執(zhí)行的順序在ie和其他非ie內(nèi)核的瀏覽器有所不同 ie是“先進(jìn)先出 ” 就是最先添加的最先執(zhí)行,其他非ie內(nèi)核的瀏覽器是 “先進(jìn)后出”,就是 最后添加的事件 先執(zhí)行。
相關(guān)文章
element-ui?對(duì)話框dialog使用echarts報(bào)錯(cuò)'dom沒有獲取到'的問題
這篇文章主要介紹了element-ui?對(duì)話框dialog里使用echarts,報(bào)錯(cuò)'dom沒有獲取到'的問題,在這個(gè)事件里邊進(jìn)行echarts的初始化,執(zhí)行數(shù)據(jù),本文結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-11-11詳解webpack+express多頁站點(diǎn)開發(fā)
這篇文章主要介紹了詳解webpack+express多頁站點(diǎn)開發(fā)2017-12-12自己實(shí)現(xiàn)string的substring方法 人民幣小寫轉(zhuǎn)大寫,數(shù)字反轉(zhuǎn),正則優(yōu)化
這是最近碰到的幾個(gè)題目,簡(jiǎn)單地寫一下我自己的方案,在此分享給大家,也希望能看到大家的方案2012-09-09精解window.setTimeout()&window.setInterval()使用方式與參數(shù)傳遞問題!
精解window.setTimeout()&window.setInterval()使用方式與參數(shù)傳遞問題!...2007-11-11動(dòng)態(tài)的改變IFrame的高度實(shí)現(xiàn)IFrame自動(dòng)伸展適應(yīng)高度
動(dòng)態(tài)的改變IFrame的高度,實(shí)現(xiàn)IFrame自動(dòng)伸展,父頁面也自動(dòng)神縮原理: 在IFrame子頁面一加載的時(shí)候,調(diào)用父IFrame對(duì)象,改變其高度2012-12-12