日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS事件冒泡

發(fā)布時間:2025/4/16 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS事件冒泡 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JavaSciprt事件中有兩個很重要的特性:事件冒泡以及目標元素。

事件冒泡: 當一個元素上的事件被觸發(fā)的時候,比如說鼠標點擊了一個按鈕,同樣的事件將會在那個元素的所有祖先元素中被觸發(fā)。這 一過程被稱為事件冒泡;這個事件從原始元素開始一直冒泡到DOM樹的最上層。

目標元素: 任何一個事件的目標元素都是最開始的那個元素,在我們的這個例子中也就是按鈕,并且它在我們的元素對象中以屬性的形 式出現(xiàn)。使用事件代理的話我們可以把事件處理器添加到一個元素上,等待一個事件從它的子級元素里冒泡上來,并且可以很方便地得知這個事件是從哪個元素開始 的。

事件的冒泡和捕獲

捕獲是從上級元素到下級元素,冒泡是從下級元素到上級元素.

在IE中,每個元素和window對象都有兩個方法:attachEvent()和detachEvent()。attachEvent()用來給 一個事件附加事件處理函數(shù)。而detachEvent()用來將事件處理函數(shù)分離出來。例如:

JS代碼

var fnClick = function() {alert(“Clicked!”);}var oDiv = document.getElementById(“div1”);oDiv.attachEvent(“onclick”, fnClick);oDiv.detachEvent(“onclick”, fnClick);

?

事件的冒泡有什么好處呢?

想象一下現(xiàn)在我們有一個10列、100行的HTML表格,你希望在用戶點擊 表格中的某一單元格的時候做點什么。比如說我有一次就需要讓表格中的每一個單元格在被點擊的時候變成可編輯狀態(tài)。如果把事件處理器加到這1000個單元格 會產(chǎn)生一個很大的性能問題,并且有可能導致內(nèi)存泄露甚至是瀏覽器的崩潰。相反地,使用事件代理的話,你只需要把一個事件處理器添加到table元素上就可 以了,這個函數(shù)可以把點擊事件給截下來,并且判斷出是哪個單元格被點擊了。

代碼很簡單,我們所要關(guān)心的只是如何檢測目標元素而已。比方說我們有一個 table元素,ID是“report”,我們?yōu)檫@個表格添加一個事件處理器以調(diào)用editCell函數(shù)。editCell函數(shù)需要判斷出傳到table 來的事件的目標元素。考慮到我們要寫的幾個函數(shù)中都有可能用到這一功能,所以我們把它單獨放到一個名為getEventTarget的函數(shù)中:

JS代碼

function getEventTarget(e) { e = e || window.event; return e.target || e.srcElement; }

?

e這個變量表示的是一個事件對象,我們只需要寫一點點跨瀏覽器的代碼來返回 目標元素,在IE里目標元素放在srcElemtn屬性或event.toElement屬性中,而在其它瀏覽器里則是target或event.relatedTarget屬性。

接下來就是editCell函數(shù)了,這個函數(shù)調(diào)用到了 getEventTarget函數(shù)。一旦我們得到了目標元素之后,剩下的事情就是看看它是否是我們所需要的那個元素了。

JS代碼

function editCell(e) { var target = getEventTarget(e); if(target.tagName.toLowerCase() === ‘td’) { // DO SOMETHING WITH THE CELL } }

?

在editCell函數(shù)中,我們通過檢查目標元素標簽名稱的方法來確定它是 否是一個表格的單元格。這種檢查也許過于簡單了點;如果它是這個目標元素單元格里的另一個元素呢?我們需要為代碼做一點小小的修改以便于其找出父級的td 元素。如果說有些單元格不需要被編輯怎么辦呢?此種情況下我們可以為那些不可編輯的單元格添加一個指定的樣式名稱,然后在把單元格變成可編輯狀態(tài)之前先檢 查它是否不包含那個樣式名稱。選擇總是多樣化的,你只需找到適合你應(yīng)用程序的那一種。

事件冒泡的優(yōu)點和缺點:

1.那些需要創(chuàng)建的以及駐留在內(nèi)存中的事件處理器少了。

這是很重要的一點,這樣我們就提高了性能,并降低了崩潰的風險。
2.在DOM更新后無須重新綁定事件處理器了。

如果你的頁面是動態(tài)生成的,比如說通過Ajax,你不再需要在元素被載入或 者卸載的時候來添加或者刪除事件處理器了。
潛在的問題也許并不那么明顯,但是一旦你注意到這些問題,你就可 以輕松地避免它們:你的事件管理代碼有成為性能瓶頸的風險,所以盡 量使它能夠短小精悍。

不是所有的事件都能冒泡

blur、focus、load和unload不能像其它事件一樣冒泡。事 實上blur和focus可以用事件捕獲而非事件冒泡的方法獲得(在IE之外的其它瀏覽器中)。
需要注意的是:

如果你的代碼處理mousemove事件的話你遇上性能瓶頸的風險可就大了,因為mousemove事件觸發(fā)非常頻繁。而mouseout則因為其 怪異的表現(xiàn)而變得很難用事件代理來管理。

消除冒泡事件的方法:

阻止JavaScript事件冒泡傳遞(cancelBubble 、stopPropagation)
下面的一段代碼即可以很好的解釋是么是冒泡效果,什么叫消除冒泡效果

HTML代碼

<!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> 阻止JavaScript事件冒泡傳遞(cancelBubble 、stopPropagation)</title> <meta name=”keywords” content=”JavaScript,事件冒泡,cancelBubble,stopPropagation” /> <script type=”text/javascript”> function doSomething (obj,evt) { alert(obj.id); var e=(evt)?evt:window.event; //判斷瀏覽器的類型,在基于ie內(nèi)核的瀏覽器中的使用cancelBubble if (window.event) { e.cancelBubble=true; } else { //e.preventDefault(); //在基于firefox內(nèi)核的瀏覽器中支持做法stopPropagation e.stopPropagation(); } } </script> </head> <body> <div id=”parent1″ onclick=”alert(this.id)” style=”width:250px;background-color:yellow”> <p>This is parent1 div.</p> <div id=”child1″ onclick=”alert(this.id)” style=”width:200px;background-color:orange”> <p>This is child1.</p> </div> <p>This is parent1 div.</p> </div> <br /> <div id=”parent2″ onclick=”alert(this.id)” style=”width:250px;background-color:cyan;”> <p>This is parent2 div.</p> <div id=”child2″ onclick=”doSomething(this,event);” style=”width:200px;background-color:lightblue;”> <p>This is child2. Will bubble.</p> </div> <p>This is parent2 div.</p> </div> </body> </html>

?

把代碼直接復制后,打開當點擊child1時不僅會彈出 child1, 對話框還會彈出 parent1,這就是冒泡事件的;

但是單擊chile2只會彈出child2卻不會彈出 parent2,這便是應(yīng)用了阻止冒泡事件的特效的效果。

轉(zhuǎn)載于:https://www.cnblogs.com/mrma/p/3891770.html

總結(jié)

以上是生活随笔為你收集整理的JS事件冒泡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品嫩草影院av蜜臀 | 五月天一区二区三区 | 亚洲激情黄色 | 日产久久久久久 | 国产精品久久久久久久久久免费看 | 麻豆视频在线观看免费网站 | 国产猛男猛女超爽免费视频 | 91久久综合亚洲鲁鲁五月天 | 精品欧美视频 | 亚洲一区二区人妻 | 欧美成人精品一区二区 | 台湾黄色网址 | 亚洲 欧美 激情 小说 另类 | 懂色av一区二区在线播放 | 久操网在线 | 秋霞影院午夜伦 | 国产精品女同 | 国产高清欧美 | 亚洲va久久久噜噜噜无码久久 | 欧美 日韩 国产 一区 | gai视频在线观看资源 | 国语对白做受欧美 | 射影院 | 91看片成人| 日韩久久久精品 | 森林影视官网在线观看 | 日韩免费精品 | 草逼视频网 | аⅴ资源天堂资源库在线 | 亚洲av毛片基地 | 美女黄页在线观看 | 日韩色吧 | 中国亚洲女人69内射少妇 | 91.xxx.高清在线| 欧美 亚洲 视频 | 成人在线免费视频 | 91视频二区 | 91九色在线 | 国产同性人妖ts口直男 | 五月婷婷狠狠爱 | 欧美一区二区福利 | 日韩久久在线 | 草草影院ccyycom | 国产日产亚洲精品 | 久久久久人妻一区精品 | 精品小视频 | 九草av| 激情综合丁香五月 | 欧美日韩亚洲精品内裤 | 免费av电影网址 | av作品在线观看 | 国产亚洲精品久久久 | 天天操夜夜撸 | 人与动物黄色片 | 日韩网站在线 | 九七超碰在线 | 久久6视频 | 日韩精品免费电影 | 嫩草影院黄| 国产精品免费91 | 黄色一级片av | 成年人视频网址 | 一区二区三区xxx | 91精品国产自产精品男人的天堂 | 国产成人精品av在线观 | 成人wwwww免费观看 | 欧美视频xxx| 美女扒开尿口让男人捅爽 | 牛牛超碰| 黄色国产在线播放 | 久久伊人爱| 六月婷婷在线观看 | 熟女高潮一区二区三区 | 色综合综合色 | 欧美黄视频在线观看 | 手机天堂网 | 免费在线观看黄色av | 在线视频日韩精品 | 欧美日韩少妇精品 | 99亚洲天堂 | a毛片在线 | 人人九九精 | 亚洲一区二区精品在线观看 | 中文在线a√在线 | 精品国产乱码一区二 | 国产精品久久久久无码av色戒 | 中文字幕在线国产 | 午夜激情久久久 | 日韩性插 | 国产av一区二区三区最新精品 | 久久精品国产亚洲av嫖农村妇女 | 日本在线观看一区二区 | 女人下边被添全过视频 | 91视频在线观看网站 | 久久青 | 播播网色播播 | 欧美日韩成人一区二区 | 亚洲精品视频在线播放 | 日韩美女中文字幕 |