日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解JavaScript 事件流

瀏覽:177日期:2023-10-16 15:52:24

事件

HTML中與javascript交互是通過(guò)事件驅(qū)動(dòng)來(lái)實(shí)現(xiàn)的,例如鼠標(biāo)點(diǎn)擊事件、頁(yè)面的滾動(dòng)事件onscroll等等,可以向文檔或者文檔中的元素添加事件偵聽(tīng)器來(lái)預(yù)訂事件。想要知道這些事件是在什么時(shí)候進(jìn)行調(diào)用的,就需要了解一下“事件流”的概念。

事件流

事件流描述的就是從頁(yè)面中接收事件的順序。而早期的IE和Netscape提出了完全相反的事件流概念,IE事件流是事件冒泡,而Netscape的事件流就是事件捕獲。

事件流類(lèi)別

事件冒泡

即從下至上,從目標(biāo)觸發(fā)的元素逐級(jí)向上傳播,直到window對(duì)象。

詳解JavaScript 事件流

事件捕獲

即從上至下,從document逐級(jí)向下傳播到目標(biāo)元素。

詳解JavaScript 事件流

后來(lái)ECMAScript在DOM2中對(duì)事件流進(jìn)行了進(jìn)一步規(guī)范,基本上就是上述二者的結(jié)合。

DOM2級(jí)事件規(guī)定的事件流包括三個(gè)階段:

事件捕獲階段 處于目標(biāo)階段 事件冒泡階段

注意⚠️:先捕獲后冒泡,但是在目標(biāo)節(jié)點(diǎn)上誰(shuí)寫(xiě)在前面誰(shuí)先執(zhí)行。但是在目標(biāo)元素上不區(qū)分冒泡還是捕獲,按綁定的順序來(lái)執(zhí)行。

詳解JavaScript 事件流

DOM事件級(jí)別

分為四個(gè)級(jí)別

詳解JavaScript 事件流

DOM0:不是W3C規(guī)范。

DOM1:開(kāi)始是W3C規(guī)范。專(zhuān)注于HTML文檔和XML文檔。

DOM2:對(duì)DOM1增加了樣式表對(duì)象模型

DOM3:對(duì)DOM2增加了內(nèi)容模型 (DTD 、Schemas) 和文檔驗(yàn)證。

DOM0級(jí)

DOM0級(jí)事件具有極好的跨瀏覽器優(yōu)勢(shì),會(huì)以最快的速度綁定。綁定方式有如下兩種

行內(nèi)綁定(內(nèi)聯(lián)模型)

將函數(shù)名直接作為html標(biāo)簽中屬性的屬性值。

<div onclick='btnClick()'>按鈕</div><script>function btnClick(){ console.log('hello');}</script>

動(dòng)態(tài)綁定(腳本模型)

通過(guò)在JS中選中某個(gè)節(jié)點(diǎn),然后給節(jié)點(diǎn)添加onclick屬性

<div id='btn'>按鈕</div><script>var btn = document.getElementById('btn');btn.onclick = function(){ console.log('點(diǎn)擊');}</script>

注意⚠️

DOM0級(jí)同一個(gè)節(jié)點(diǎn)只能添加一次同類(lèi)型事件,后添加的同類(lèi)型事件會(huì)覆蓋前面的事件 DOM0級(jí)只支持冒泡

DOM1級(jí)

其中DOM1級(jí)事件處理標(biāo)準(zhǔn)中并沒(méi)有定義事件相關(guān)的內(nèi)容,所以沒(méi)有所謂的DOM1事件處理

DOM2級(jí)

DOM2級(jí)定義了兩個(gè)事件處理程序。(觀(guān)察者模式)

addEventListener() ---添加事件偵聽(tīng)器 removeEventListener() ---刪除事件偵聽(tīng)器

函數(shù)均有3個(gè)參數(shù), 第一個(gè)參數(shù)是要處理的事件名 第二個(gè)參數(shù)是作為事件處理程序的函數(shù) 第三個(gè)參數(shù)是一個(gè)boolean值,默認(rèn)false表示使用冒泡機(jī)制,true表示捕獲機(jī)制。

<div id='btn'>按鈕</div><script>var btn=document.getElementById('btn');btn.addEventListener('click',hello,false);btn.addEventListener('click',helloagain,false);function hello(){ console.log('hello');}function helloagain(){ console.log('hello again');}</script>// 點(diǎn)擊后結(jié)果: // hello// hello again

注意⚠️

如果定義了一模一樣的監(jiān)聽(tīng)方法時(shí),是會(huì)發(fā)生覆蓋的。

<div id='btn'>點(diǎn)擊</div><script>var btn=document.getElementById('btn');btn.addEventListener('click',hello,false);btn.addEventListener('click',hello,false);function hello(){ console.log('hello');}</script>// 點(diǎn)擊后結(jié)果: // hello

DOM3級(jí)

對(duì)DOM2增加了內(nèi)容模型 (DTD 、Schemas) 和文檔驗(yàn)證。定義了一些新的事件,比如鍵盤(pán)事件,還可以自定義事件。

自定義事件

自定義事件不是由DOM原生觸發(fā)的,它的目的是讓開(kāi)發(fā)人員創(chuàng)建自己的事件。要?jiǎng)?chuàng)建的自定義事件可以由createEvent('CustomEvent'); 返回的對(duì)象有一個(gè)initCustomEvent()方法接收如下四個(gè)參數(shù)。

type:字符串,觸發(fā)的事件類(lèi)型,自定義。例如 “keyDown”,“selectedChange”; bubble(布爾值):標(biāo)示事件是否應(yīng)該冒泡; cancelable(布爾值):標(biāo)示事件是否可以取消; detail(對(duì)象):任意值,保存在event對(duì)象的detail屬性中;

可以像分配其他事件一樣在DOM中分派創(chuàng)建的自定義事件對(duì)象。如:

var div = document.getElementById('myDiv');EventUtil.addEventHandler(div,'myEvent', function () { alert('div myEvent!');});EventUtil.addEventHandler(document,'myEvent',function(){ alert('document myEvent!');});if(document.implementation.hasFeature('CustomEvents','3.0')){ var e = document.createEvent('CustomEvent'); e.initCustomEvent('myEvent',true,false,'hello world!'); div.dispatchEvent(e);}

這個(gè)例子中創(chuàng)建了一個(gè)冒泡事件“myEvent”。而event.detail的值被設(shè)置成了一個(gè)簡(jiǎn)單的字符串,然后在div和document上偵聽(tīng)該事件,因?yàn)樵趇nitCustomEvent中設(shè)置了事件冒泡。所以當(dāng)div激發(fā)該事件時(shí),瀏覽器會(huì)將該事件冒泡到document。

阻止冒泡

stopPropagation函數(shù)

btn.addEventListener(’click’,function(ev){ ev.stopPropagation(); console.log(’阻止冒泡’)}, false)

事件委托(事件代理)

原理

如果有多個(gè)DOM節(jié)點(diǎn)需要監(jiān)聽(tīng)事件的情況下,給每個(gè)DOM綁定監(jiān)聽(tīng)函數(shù),會(huì)極大的影響頁(yè)面的性能,因?yàn)槲覀兺ㄟ^(guò)事件委托來(lái)進(jìn)行優(yōu)化,事件委托利用的就是冒泡的原理。

<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li></ul><script> var li_list = document.getElementsByTagName(’li’) for(let index = 0;index<li_list.length;index++){ li_list[index].addEventListener(’click’, function(ev){ console.log(ev.currentTarget.innerHTML) }) }</script>

正常情況我們給每一個(gè)li都會(huì)綁定一個(gè)事件,但是如果這時(shí)候li是動(dòng)態(tài)渲染的,數(shù)據(jù)又特別大的時(shí)候,每次渲染后(有新增的情況)我們還需要重新來(lái)綁定,又繁瑣又耗性能;這時(shí)候我們可以將綁定事件委托到li的父級(jí)元素,即ul。

var ul_dom = document.getElementsByTagName(’ul’)ul_dom[0].addEventListener(’click’, function(ev){ console.log(ev.target.innerHTML)})

target和currentTarget區(qū)別:

target返回觸發(fā)事件的元素,不一定是綁定事件的元素 currentTarget返回的是綁定事件的元素

優(yōu)點(diǎn)

提高性能: 每一個(gè)函數(shù)都會(huì)占用內(nèi)存空間,只需添加一個(gè)事件處理程序代理所有事件,所占用的內(nèi)存空間更少。 動(dòng)態(tài)監(jiān)聽(tīng): 使用事件委托可以自動(dòng)綁定動(dòng)態(tài)添加的元素,即新增的節(jié)點(diǎn)不需要主動(dòng)添加也可以一樣具有和其他元素一樣的事件。

以上就是詳解JavaScript 事件流的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 事件流的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产鲁一鲁****| 美女网站一区| 综合色一区二区| 国产精品91一区二区三区| 日韩精品免费一区二区三区| 久久久久国产精品一区三寸| 中文一区二区| 日韩高清不卡在线| 中文字幕亚洲在线观看| 老鸭窝毛片一区二区三区| 久久在线免费| 亚洲欧美日韩综合国产aⅴ| 日韩午夜视频在线| 欧美精品二区| 亚洲午夜电影| 国产精品日韩精品在线播放 | 久久成人福利| 亚洲不卡系列| 青青青国产精品| 蜜桃成人精品| 久久精品72免费观看| 国产精品久久久免费| 激情视频一区二区三区| 日本亚洲三级在线| 婷婷激情一区| 日韩区一区二| 午夜欧美精品久久久久久久| 国产调教精品| 国产精品普通话对白| 麻豆精品国产91久久久久久| 午夜免费一区| 精品美女视频| 日韩高清电影免费| 国产99精品一区| 国产精品羞羞答答在线观看| 午夜欧美理论片| 国产精品久久久久久久免费软件 | 国产一区日韩一区| 久久中文字幕一区二区| 日韩成人午夜精品| 美国三级日本三级久久99 | 热三久草你在线| 欧美日韩一视频区二区| 久久亚洲不卡| 国产亚洲高清一区| 免费久久99精品国产| 激情不卡一区二区三区视频在线| 天堂av一区| 日韩一区免费| 在线国产精品一区| 伊人久久大香线蕉av不卡| 国产精品久久久久久久久妇女| 国产亚洲精品精品国产亚洲综合| 日本在线不卡视频| 日韩精选在线| 免费人成黄页网站在线一区二区| 99久久婷婷这里只有精品| 日韩电影免费在线观看| 中文字幕人成乱码在线观看| 麻豆精品视频在线观看视频| 天堂va蜜桃一区二区三区| 亚洲永久av| 国产不卡av一区二区| 国产999精品在线观看| 国产一区二区三区久久| 欧美13videosex性极品| 亚洲先锋成人| 中文字幕av一区二区三区四区| 亚洲综合婷婷| 亚洲婷婷免费| 免费久久精品视频| 欧美天堂一区二区| 福利视频一区| 久久中文字幕av一区二区不卡| 亚洲小说欧美另类婷婷| 免费观看在线综合| 国产精品一区二区99| 中文字幕色婷婷在线视频| 久久人人88| 亚洲影视一区| 天堂8中文在线最新版在线| 亚洲精品99| 欧美色图一区| 日韩一区二区三区免费视频| 久久国产精品免费精品3p | 神马日本精品| 中文字幕视频精品一区二区三区| 91麻豆精品激情在线观看最新| 国产精品亚洲欧美| 婷婷综合网站| 九九九精品视频| 久久亚洲风情| 色婷婷精品视频| 青青草91久久久久久久久| 国产精品啊v在线| 六月丁香综合| 国产精品videossex| 99pao成人国产永久免费视频| 亚洲精品在线二区| 国产一区二区久久久久| 亚洲一区二区三区四区电影| 中文一区一区三区高中清不卡免费| 亚洲精品福利| 国产精品美女| 日韩天堂在线| 麻豆精品久久| 国产精品亚洲欧美日韩一区在线| 午夜在线一区二区| 亚洲精品va| 不卡福利视频| 综合激情一区| 欧美一级精品| 神马午夜久久| 午夜久久av | 日韩精品中文字幕一区二区| 亚洲男女av一区二区| 亚洲三级国产| 亚洲a成人v| 色吊丝一区二区| 国产欧美亚洲精品a| 久久美女精品| 国产欧美精品久久| 久久一二三区| 欧美成a人片免费观看久久五月天| 亚洲成人免费| 97精品国产| 国产精品手机在线播放| 免费欧美日韩| 极品日韩av| 国产精品porn| 亚洲日产av中文字幕| 深夜视频一区二区| 国产精品草草| 国产欧美日韩精品一区二区三区 | 香蕉久久夜色精品国产| 麻豆视频久久| 综合一区av| 9国产精品视频| 久久国产小视频| 97精品一区| 日韩av自拍| 国产精品白丝一区二区三区| 91九色综合| 久久精品99国产精品| 亚洲69av| 国产亚洲第一伦理第一区| 欧美三级第一页| 欧美精品99| 国产激情精品一区二区三区| 久久国产人妖系列| 在线日韩成人| 亚洲乱码视频| 国产欧美一区| 久久精品五月| 福利一区和二区| 欧美sss在线视频| 欧美日韩激情在线一区二区三区| 激情综合网址| 好看的av在线不卡观看| 日韩影院在线观看| 视频一区中文字幕| 欧美亚洲综合视频| 精品一区二区三区中文字幕视频| 不卡专区在线| 日韩午夜在线| 国精品一区二区| 日韩中文字幕亚洲一区二区va在线| 综合一区在线| 国产成人精品一区二区三区视频| 久久精品一本| 久久一级电影| 欧美片第1页综合| 99久久精品费精品国产| 免费日韩视频| 欧美伊人影院| 日韩国产欧美| 日本一区二区三区视频在线看 | 黄毛片在线观看| 午夜在线视频观看日韩17c| 国产精品密蕾丝视频下载| 久久成人高清| 欧美jjzz| 日本a口亚洲| 激情五月色综合国产精品| 国产精品久久久久久久久久10秀| 精品国产麻豆| 日本成人中文字幕| 99久久激情| 欧美精品国产一区| 伊人影院久久| 成人在线丰满少妇av| 亚洲精品一级| 日韩精品不卡一区二区| 日本欧美久久久久免费播放网| 999久久久国产精品| 国产日韩免费| 婷婷五月色综合香五月| 日韩中文字幕1| 国产一区亚洲| 欧美日韩视频网站|