电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

詳解JavaScript 事件流

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

事件

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

事件流

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

事件流類別

事件冒泡

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

詳解JavaScript 事件流

事件捕獲

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

詳解JavaScript 事件流

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

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

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

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

詳解JavaScript 事件流

DOM事件級別

分為四個級別

詳解JavaScript 事件流

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

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

DOM2:對DOM1增加了樣式表對象模型

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

DOM0級

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

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

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

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

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

通過在JS中選中某個節(jié)點,然后給節(jié)點添加onclick屬性

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

注意⚠️

DOM0級同一個節(jié)點只能添加一次同類型事件,后添加的同類型事件會覆蓋前面的事件 DOM0級只支持冒泡

DOM1級

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

DOM2級

DOM2級定義了兩個事件處理程序。(觀察者模式)

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

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

<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>// 點擊后結(jié)果: // hello// hello again

注意⚠️

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

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

DOM3級

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

自定義事件

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

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

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

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);}

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

阻止冒泡

stopPropagation函數(shù)

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

事件委托(事件代理)

原理

如果有多個DOM節(jié)點需要監(jiān)聽事件的情況下,給每個DOM綁定監(jiān)聽函數(shù),會極大的影響頁面的性能,因為我們通過事件委托來進(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>

正常情況我們給每一個li都會綁定一個事件,但是如果這時候li是動態(tài)渲染的,數(shù)據(jù)又特別大的時候,每次渲染后(有新增的情況)我們還需要重新來綁定,又繁瑣又耗性能;這時候我們可以將綁定事件委托到li的父級元素,即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)點

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

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

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 传爱自考网_传爱自学考试网| 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 中国在职研究生招生信息网 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 博医通医疗器械互联网供应链服务平台_博医通 | 鑫达滑石-辽宁鑫达滑石集团 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 深圳市万色印象美业有限公司| 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 游戏版号转让_游戏资质出售_游戏公司转让-【八九买卖网】 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 合肥触摸一体机_触摸查询机厂家_合肥拼接屏-安徽迅博智能科技 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 无锡市珂妮日用化妆品有限公司|珂妮日化官网|洗手液厂家 | 聚合甘油__盐城市飞龙油脂有限公司| 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 |