成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript:深入理解事件流

Null / 1888人閱讀

摘要:所有節(jié)點(diǎn)中都包含這兩個(gè)方法,并且它們都接收個(gè)參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個(gè)布爾值。當(dāng)這個(gè)布爾值為時(shí),表示在捕獲階段調(diào)用事件處理程序若果是,表示在冒泡階段調(diào)用事件處理程序。

事件流

定義
1.事件流描述的是從頁面中接收事件的順序,也可理解為事件在頁面中傳播的順序。
2.事件就是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作。諸如click(點(diǎn)擊)、load(加載)、mouseover(鼠標(biāo)懸停)。
3.事件處理程序響應(yīng)某個(gè)事件的函數(shù)就叫事件處理程序(或事件偵聽器)。

下面所示例子注冊(cè)事件的方式均使用DOM2級(jí)事件定義的事件處理程序進(jìn)行注冊(cè),兼容性的問題不涉及。"DOM2級(jí)事件"定義了兩個(gè)方法,用于處理指定和刪除事件處理程序的操作:addEventListener()removeEventListener()。所有DOM節(jié)點(diǎn)中都包含這兩個(gè)方法,并且它們都接收3個(gè)參數(shù):要處理的事件名、作為事件處理程序的函數(shù)和一個(gè)布爾值。當(dāng)這個(gè)布爾值為true時(shí),表示在捕獲階段調(diào)用事件處理程序;若果是false,表示在冒泡階段調(diào)用事件處理程序。

事件的作用范圍討論

示例1

html

  

css

#wrap {
  width: 200px;
  height: 200px;
  background: orange;
}
#outer {
  position: relative;
  top: 50px;
  left: 50px;
  width: 100px;
  height: 100px;
  background: #eeddff;
}
#inner {
  position: relative;
  top: 25px;
  left:25px;
  width: 50px;
  height: 50px;
  background: #44ddff;
}

js

var wrap = document.getElementById("wrap");
wrap.addEventListener("click",function(){
  alert("789");
},false);

output

問題1:容器元素wrap注冊(cè)了事件,那么此事件的作用范圍是什么?

思考1:根據(jù)上面例子,當(dāng)點(diǎn)擊橘色塊中(包括被子元素覆蓋的部分)任何一部分時(shí),都會(huì)彈出789,點(diǎn)擊橘色塊外面的部分并沒有任何反應(yīng),那么我們是不是就可以得出這這樣結(jié)論,元素注冊(cè)事件的作用范圍為元素自身在頁面中所占的空間大小,但是真的就是這樣嗎?下面我們做個(gè)試驗(yàn)

試驗(yàn)1:
css代碼修改如下,其他部分同上

#wrap {
  width: 200px;
  height: 200px;
  background: orange;
}
#outer {
  position: relative;
  top: 50px;
  left: 50px;
  width: 100px;
  height: 100px;
  background: #eeddff;
}
/*inner中的top被修改*/
#inner {
  position: relative;
  top: 152px;
  left:25px;
  width: 50px;
  height: 50px;
  background: #44ddff;
}

output

結(jié)論1:當(dāng)點(diǎn)擊橘色塊外淺藍(lán)色部分的時(shí)候,同樣的也彈出了789,而淺藍(lán)色部分是嵌套在wrap元素之內(nèi)的元素,故可得出結(jié)論,當(dāng)元素注冊(cè)了事件,此事件的作用范圍為:1.元素自己所占頁面空間部分加嵌套元素所占空間范圍(若嵌套元素覆蓋在容器元素上,則事件的作用范圍為容器元素自身所占空間大小)

事件的執(zhí)行順序討論

問題2:根據(jù)上面的示例1,那么這里大家可以再思考一個(gè)問題,若容器元素wrap以及其嵌套元素outer,inner都注冊(cè)了click事件,根據(jù)試驗(yàn)1得出的結(jié)論,那么嵌套在最里層的元素inner所占頁面的空間范圍內(nèi),一共有3個(gè)click事件都作用在其上,那么當(dāng)在inner元素的作用范圍內(nèi)點(diǎn)擊頁面時(shí),3個(gè)事件的事件處理程序執(zhí)行的順序又是如何的?

要解決上面我提出的問題2,這就涉及到了兩種處理事件流的不同的機(jī)制,事件冒泡和事件捕獲
事件冒泡

IE的事件流叫事件冒泡,即事件開始時(shí)由最具體的元素(文檔中嵌套層次最深的節(jié)點(diǎn))接收,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)。

示例2
將參數(shù)設(shè)為false,讓元素在冒泡階段調(diào)用事件處理程序

css,html代碼同示例1
js

var wrap = document.getElementById("wrap");
var outer = document.getElementById("outer");
var inner = document.getElementById("inner");

wrap.addEventListener("click",function(){
  alert("789");
},false);
outer.addEventListener("click",function(){
  alert("456");
},false);
inner.addEventListener("click",function(){
  alert("123");
},false);

結(jié)論2:在冒泡階段調(diào)用事件處理程序,上面問題的結(jié)果是這樣的:當(dāng)點(diǎn)擊頁面中心淺藍(lán)色的部分時(shí),先是彈出123,接著彈出456,最后彈出789。因此當(dāng)容器元素及其嵌套元素都在冒泡階段調(diào)用事件處理程序時(shí):事件按事件冒泡的順序執(zhí)行事件處理程序。

事件捕獲

Netscape團(tuán)隊(duì)提出的另一種事件流叫事件捕獲,事件捕獲的思想是不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件,而最具體的節(jié)點(diǎn)應(yīng)該最后接收到事件。

示例3
將參數(shù)設(shè)為true,讓元素在捕獲階段調(diào)用事件處理程序

css,html代碼同示例1
js

var wrap = document.getElementById("wrap");
var outer = document.getElementById("outer");
var inner = document.getElementById("inner");
    
wrap.addEventListener("click",function(){
  alert("wrap");
},true);
outer.addEventListener("click",function(){
  alert("outer");
},true);
inner.addEventListener("click",function(){
  alert("inner");
},true);

結(jié)論3:在捕獲階段調(diào)用事件處理程序,上面問題的結(jié)果是這樣的:當(dāng)點(diǎn)擊頁面中心淺藍(lán)色的部分時(shí),先是彈出wrap,接著彈出outer,最后彈出inner。因此當(dāng)容器元素及其嵌套元素都在捕獲階段調(diào)用事件處理程序時(shí):事件按事件捕獲的順序執(zhí)行事件處理程序。

問題3:根據(jù)思考1,思考2得出的結(jié)果,接著又有一個(gè)問題我認(rèn)為需要思考,當(dāng)同一個(gè)元素即在冒泡階段注冊(cè)了事件,又在捕獲階段注冊(cè)了同一事件,那么當(dāng)事件被觸發(fā)時(shí),事件的執(zhí)行順序又會(huì)是如何的?

要解決上面我提出的問題3,這就涉及到了DOM事件流
DOM事件流

DOM2級(jí)事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段==>處于目標(biāo)階段==>事件冒泡階段。首先發(fā)生的是事件捕獲階段,為截獲事件提供了機(jī)會(huì)。然后是實(shí)際的目標(biāo)接收事件。最后一個(gè)階段是冒泡階段,以下圖片來自w3c

示例4
css,html代碼同示例1
js

var wrap = document.getElementById("wrap");
var outet = document.getElementById("outer");
var inner = document.getElementById("inner");

wrap.addEventListener("click",function(){
  alert("789");
},false);
outer.addEventListener("click",function(){
  alert("456");
},false);
inner.addEventListener("click",function(){
  alert("123");
},false);
wrap.addEventListener("click",function(){
  alert("wrap");
},true);
outer.addEventListener("click",function(){
  alert("outer");
},true);
inner.addEventListener("click",function(){
  alert("inner");
},true);

結(jié)論4:當(dāng)點(diǎn)擊頁面中心淺藍(lán)色部分的時(shí)候,先從最不具體的節(jié)點(diǎn)捕獲事件,先彈出wrap,接著彈出outer。接著處于目標(biāo)階段,先彈出123,再?gòu)棾鰅nner。緊接著,事件處于冒泡階段,先彈出456,再?gòu)棾?89。因此我們可以得出結(jié)論,當(dāng)容器元素及嵌套元素,即在捕獲階段又在冒泡階段調(diào)用事件處理程序時(shí):事件按DOM事件流的順序執(zhí)行事件處理程序,且當(dāng)事件處于目標(biāo)階段時(shí),事件調(diào)用順序決定于綁定事件的書寫順序,按上面的例子為,先調(diào)用冒泡階段的事件處理程序,再調(diào)用捕獲階段的事件處理程序。具體demo可看評(píng)論,@ Levon

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85915.html

相關(guān)文章

  • 理解DOM事件的三個(gè)階段

    摘要:本文主要解決兩個(gè)問題什么是事件流事件流的三個(gè)階段起因在學(xué)習(xí)前端的大半年來,對(duì)事件了解甚少。事件流所描述的就是從頁面中接受事件的順序。事件流事件流包括三個(gè)階段。防止事件冒泡而帶來不必要的錯(cuò)誤和困擾。分有事件冒泡與事件捕獲兩種。 本文主要解決兩個(gè)問題: 什么是事件流 DOM事件流的三個(gè)階段 起因 在學(xué)習(xí)前端的大半年來,對(duì)DOM事件了解甚少。一般也只是用用onclick來綁定個(gè)點(diǎn)擊事件。...

    xiangzhihong 評(píng)論0 收藏0
  • 理解DOM事件的三個(gè)階段

    摘要:本文主要解決兩個(gè)問題什么是事件流事件流的三個(gè)階段起因在學(xué)習(xí)前端的大半年來,對(duì)事件了解甚少。事件流所描述的就是從頁面中接受事件的順序。事件流事件流包括三個(gè)階段。防止事件冒泡而帶來不必要的錯(cuò)誤和困擾。分有事件冒泡與事件捕獲兩種。 本文主要解決兩個(gè)問題: 什么是事件流 DOM事件流的三個(gè)階段 起因 在學(xué)習(xí)前端的大半年來,對(duì)DOM事件了解甚少。一般也只是用用onclick來綁定個(gè)點(diǎn)擊事件。...

    afishhhhh 評(píng)論0 收藏0
  • JavaScript 工作原理之五-深入理解 WebSockets 和帶有 SSE 機(jī)制的HTTP/

    摘要:幀協(xié)議讓我們深入了解下幀協(xié)議。目前可用的值該幀接續(xù)前面一幀的有效載荷。該幀包含二進(jìn)制數(shù)據(jù)。幀有以下幾類長(zhǎng)度表示有效載荷的長(zhǎng)度。數(shù)據(jù)分片有效載荷數(shù)據(jù)可以被分成多個(gè)獨(dú)立的幀。接收端會(huì)緩沖這些幀直到位有值。 原文請(qǐng)查閱這里,略有改動(dòng),本文采用知識(shí)共享署名 3.0 中國(guó)大陸許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原...

    lijinke666 評(píng)論0 收藏0
  • 前端周報(bào):前端面試題及答案總結(jié);JavaScript參數(shù)傳遞的深入理解

    摘要:前端面試題及答案總結(jié)掘金技術(shù)征文金三銀四,金九銀十,用來形容求職最好的幾個(gè)月。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。 showImg(https://segmentfault.com/img/bVVQOH?w=640&h=319); 1、2017前端面試題及答案總結(jié) |掘金技術(shù)征文 金三銀四,金九銀十,用來形容求職最好的幾個(gè)月...

    ermaoL 評(píng)論0 收藏0
  • 深入理解js Dom事件機(jī)制(一)——事件

    摘要:事件捕獲提出的事件流模型稱為事件捕獲。事件代理則是一種簡(jiǎn)單有效的技巧,通過它可以把事件處理器添加到一個(gè)父級(jí)元素上,從而避免把事件處理器添加到多個(gè)子級(jí)元素上。更新無需重新綁定事件處理器,因?yàn)槭录韺?duì)不同子元素可采用不同處理方法。 首先我們思考一個(gè)很有意思的事情:一張紙上畫了兩個(gè)同心圓,當(dāng)我們把手指放到圓心上時(shí),手指指向的不是一個(gè)圓,而是紙上的兩個(gè)圓,同理之,當(dāng)我們單擊網(wǎng)頁上的一個(gè)div...

    OBKoro1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<