事件
js組成:ECMA語法,規(guī)定了js的基本規(guī)則添诉,類似于使用var定義變量屁桑,使用for來規(guī)定循環(huán)。
BOM:瀏覽器對象模型栏赴,就是使用我們的js來操作瀏覽器
DOM:文檔對象模型蘑斧,文檔:我們的html標(biāo)簽在被瀏覽器渲染時(shí)會(huì)生成一顆標(biāo)簽樹,我們把這棵樹稱為文檔樹或文檔,每一個(gè)標(biāo)簽在js當(dāng)中都可以抽象為一個(gè)對象竖瘾。則DOM可以理解為沟突,html標(biāo)簽在js當(dāng)中的對象映射,則我們可以在dom中操作html元素
把瀏覽器當(dāng)作最頂層的容器捕传,抽象為文字可以理解為
window>>document>>html>>head/body>>其他元素
這個(gè)層級關(guān)系就可以理解為文檔樹了
則會(huì)出現(xiàn)以下概念
1》凡是出現(xiàn)在html中的標(biāo)簽被瀏覽器解析的時(shí)候都會(huì)被掛載島dom樹上
2》dom樹上的每個(gè)標(biāo)簽都是一個(gè)獨(dú)立的對象惠拭,既然是對象就會(huì)有屬性和方法。我們在標(biāo)簽上注冊一個(gè)事件庸论,當(dāng)事件滿足條件被觸發(fā)之后就會(huì)執(zhí)行方法
3》事件的概念就是:讓html在某些特定條件下執(zhí)行了一段js腳本职辅,某些特定的條件就是如單擊,雙擊聂示,鼠標(biāo)經(jīng)過等域携,這些條件以屬性的形式呈現(xiàn)在html代碼中,而觸發(fā)執(zhí)行的js腳本則通常為方法
這里我們需要了解三種鱼喉,分別為最原始的html混合事件寫法秀鞭,dom0級寫法、dom2級寫法
1.最原始的寫法:和html混合在一起寫扛禽,缺點(diǎn)是代碼高冗余锋边,且無法添加多個(gè)事件處理函數(shù)如上文對事件的舉例則為典型的html事件處理程序寫法
2.dom0級:將html代碼和js代碼分離,且支持匿名函數(shù)旋圆,可以看到完美的改進(jìn)了1的冗余缺憾宠默,所有的事件相關(guān)操作都在js中完成
3.dom2級:ie使用attachEventListener其他非ie使用addEventListener,可以支持綁定多個(gè)事件灵巧,瞧吧搀矫,又一個(gè)缺憾被完美解決了,而且dom2級還可以自定義事件流刻肄,好瓤球,到這里大家留個(gè)心,這是第二部分我們要介紹的重點(diǎn)敏弃。牢記這個(gè)名詞于心哦
4.dom3級
事件流
事件流官網(wǎng)定義:描述的是從頁面中接收事件的順序卦羡,那~~~是誰從頁面接收事件的順序呢?接收的順序有啥子呢麦到?接收的范圍呢绿饵?
接收順序(事件流方式),需要我們了解:
- 事件捕獲:什么叫捕獲瓶颠,其實(shí)不用扯那么多一句話從最不具體的到最具體的
- 事件冒泡:什么叫冒泡拟赊,正好和上面相反,從最具體的到最不具體的
- 為什么會(huì)有兩種事件流方式呢粹淋?歷史原因吸祟,ie提出的是事件冒泡瑟慈,而w3c提出的是事件捕獲。
- 現(xiàn)代瀏覽器高級了屋匕,那葛碧。。过吻。进泼。。嗯疮装,我知道你要問啥缘琅,你一定要問瀏覽器內(nèi)部是如何解析這兩種事件流的,它的執(zhí)行順序:事件捕獲-》目標(biāo)階段-》事件冒泡廓推,一句話就是先捕獲后冒泡
window-》dowument-》html-》head/body-》div或其他元素
注意昂刷袍,現(xiàn)在的瀏覽器都是從window開始滴,不管冒泡還是捕獲其的傳遞范圍一定是父子關(guān)系樊展,也就是外層到內(nèi)層呻纹,或者從內(nèi)層到外層。假設(shè)我們給div添加一個(gè)事件方法专缠,如果是事件捕獲的話是從window開始雷酪,因?yàn)樗亲畈痪唧w的元素,如果是冒泡的話則是從div開始涝婉,所以這里的具體不具體是相對于添加事件的元素而言的哥力,說到這里,大家一定要曉得墩弯,我們要使用事件流通常要配合dom2級事件去寫吩跋,要是讀到這里你還不了解這個(gè),那寶寶就讓你氣死鳥~哦渔工,還要知道的一點(diǎn)我們現(xiàn)開發(fā)中多使用的事件流通常是冒泡锌钮,嗯這點(diǎn)隨了ie了,但是要注意現(xiàn)在的主流瀏覽器默認(rèn)就是冒泡引矩,但通常我們在使用addEventListener這個(gè)方法的時(shí)候他的第三個(gè)參數(shù)還是會(huì)顯示的指定為false梁丘,即為不捕獲**。
捕獲和冒泡的方式?jīng)Q定著瀏覽器何時(shí)去處理這個(gè)事件旺韭,如果我把事件聲明在冒泡階段處理氛谜,那么在捕獲階段即使捕獲到了這個(gè)事件,事件也是不會(huì)被執(zhí)行滴
<div id="one">
<div id="two">
<div id="three"></div>
</div>
</div>
one.addEventListener('click',function(e){
console.log('one');
},false);
two.addEventListener('click',function(e){
console.log('two');
},false);
three.addEventListener('click',function(e){
console.log('three');
},true);
使用的是dom2級中的非ie方法区端,從代碼中可以看到one和two為冒泡值漫,three為捕獲
當(dāng)我們點(diǎn)擊最里面的div的時(shí)候,打印數(shù)序應(yīng)該為three->two->one
最后還是冒泡的執(zhí)行順序