国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript事件委托的技術原理探討示例

2019-11-20 20:49:05
字體:
來源:轉載
供稿:網友

如今的JavaScript技術界里最火熱的一項技術應該是‘事件委托(event delegation)'了。使用事件委托技術能讓你避免對特定的每個節點添加事件監聽器;相反,事件監聽器是被添加到它們的父元素上。事件監聽器會分析從子元素冒泡上來的事件,找到是哪個子元素的事件。基本概念非常簡單,但仍有很多人不理解事件委托的工作原理。這里我將要解釋事件委托是如何工作的,并提供幾個純JavaScript的基本事件委托的例子。

假定我們有一個UL元素,它有幾個子元素:

復制代碼 代碼如下:

<ul id="parent-list">
<li id="post-1">Item 1</li>
<li id="post-2">Item 2</li>
<li id="post-3">Item 3</li>
<li id="post-4">Item 4</li>
<li id="post-5">Item 5</li>
<li id="post-6">Item 6</li>
</ul>


我們還假設,當每個子元素被點擊時,將會有各自不同的事件發生。你可以給每個獨立的li元素添加事件監聽器,但有時這些li元素可能會被刪除,可能會有新增,監聽它們的新增或刪除事件將會是一場噩夢,尤其是當你的監聽事件的代碼放在應用的另一個地方時。但是,如果你將監聽器安放到它們的父元素上呢?你如何能知道是那個子元素被點擊了?

簡單:當子元素的事件冒泡到父ul元素時,你可以檢查事件對象的target屬性,捕獲真正被點擊的節點元素的引用。下面是一段很簡單的JavaScript代碼,演示了事件委托的過程:
復制代碼 代碼如下:


// 找到父元素,添加監聽器...
document.getElementById("parent-list").addEventListener("click",function(e) {
// e.target是被點擊的元素!
// 如果被點擊的是li元素
if(e.target && e.target.nodeName == "LI") {
// 找到目標,輸出ID!
console.log("List item ",e.target.id.replace("post-")," was clicked!");
}
});


第一步是給父元素添加事件監聽器。當有事件觸發監聽器時,檢查事件的來源,排除非li子元素事件。如果是一個li元素,我們就找到了目標!如果不是一個li元素,事件將被忽略。這個例子非常簡單,UL和li是標準的父子搭配。讓我們試驗一些差異比較大的元素搭配。假設我們有一個父元素div,里面有很多子元素,但我們關心的是里面的一個帶有”classA” CSS類的A標記:
復制代碼 代碼如下:


// 獲得父元素DIV, 添加監聽器...
document.getElementById("myDiv").addEventListener("click",function(e) {
// e.target是被點擊的元素
if(e.target && e.target.nodeName == "A") {
// 獲得CSS類名
var classes = e.target.className.split(" ");
// 搜索匹配!
if(classes) {
// For every CSS class the element has...
for(var x = 0; x < classes.length; x++) {
// If it has the CSS class we want...
if(classes[x] == "classA") {
// Bingo!
console.log("Anchor element clicked!");

// Now do something here....

}
}
}

}
});

上面這個例子中不僅比較了標簽名,而且比較了CSS類名。雖然稍微復雜了一點,但還是很具代表性的。比如,如果某個A標記里有一個span標記,則這個span將會成為target元素。這個時候,我們需要上溯DOM樹結構,找到里面是否有一個 A.classA 的元素。

因為大部分程序員都會使用jQuery等工具庫來處理DOM元素和事件,我建議大家都使用里面的事件委托方法,因為這里工具庫里都提供了高級的委托方法和元素甄別方法。

希望這篇文章能幫助你理解JavaScript事件委托的幕后原理,希望你也感受到了事件委托的強大用處!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 克东县| 都江堰市| 汝州市| 武邑县| 溧阳市| 芦山县| 东兰县| 沙雅县| 武清区| 云浮市| 温宿县| 陵川县| 景德镇市| 东方市| 荆门市| 京山县| 辽源市| 买车| 咸阳市| 邓州市| 太谷县| 洪江市| 辽宁省| 罗平县| 新绛县| 德兴市| 察雅县| 舟曲县| 集安市| 黑山县| 都安| 井陉县| 惠水县| 博白县| 仁化县| 外汇| 沁阳市| 南投市| 雷波县| 犍为县| 望城县|