事件冒泡是指當一個元素上的事件被觸發時,會從該元素開始逐層向上觸發其父級元素的同類型事件,直到根元素。這種傳遞事件的機制有時會給頁面帶來一些不必要的問題,所以我們需要阻止事件冒泡。jQuery為此提供了多種方法,本篇文章將從多個方面對此進行詳細闡述。
一、e.stopPropagation()
e.stopPropagation() 是一個函數,可以在事件處理過程中調用以停止事件傳播,被阻止傳播的事件不會再被分派到其它的節點上。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用e.stopPropagation()阻止事件冒泡
$("#inner").click(function(e) {
e.stopPropagation();
console.log("Inner clicked");
});
$("#outer").click(function(e) {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過調用 e.stopPropagation(),我們只阻止了事件在 inner 元素上的冒泡,因此沒有觸發外部元素上的 click 事件。
二、return false
在 jQuery 中,當事件處理函數返回 false 時,會同時調用 e.stopPropagation() 和 e.preventDefault(),阻止事件冒泡和默認行為。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用return false阻止事件冒泡和默認行為
$("#inner").click(function() {
console.log("Inner clicked");
return false;
});
$("#outer").click(function() {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過返回 false,我們同時阻止了事件在 inner 元素上的冒泡和默認行為,因此沒有觸發外部元素上的 click 事件。
三、bind 和 on 的區別
在 jQuery 中,bind() 和 on() 都可以用來綁定事件處理函數。但它們在阻止事件冒泡時有些許不同:
1. bind()
bind() 的使用方式類似於 addEventListener(),會在元素上添加一個處理函數。如果希望阻止事件冒泡,需要在處理函數內部使用 e.stopPropagation() 或返回 false。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用bind()添加事件處理函數
$("#inner").bind("click", function(e) {
e.stopPropagation();
console.log("Inner clicked");
});
$("#outer").bind("click", function() {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過調用 e.stopPropagation(),我們只阻止了事件在 inner 元素上的冒泡,因此沒有觸發外部元素上的 click 事件。
2. on()
on() 是 jQuery 新增的事件綁定方法,相比 bind() 更加強大。它可以綁定多個事件處理函數,多個事件用空格隔開。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用on()添加事件處理函數
$("#inner").on("click", function(e) {
e.stopPropagation();
console.log("Inner clicked");
});
$("#outer").on("click", function() {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過調用 e.stopPropagation(),我們只阻止了事件在 inner 元素上的冒泡,因此沒有觸發外部元素上的 click 事件。
四、delegate 和 on 的區別
在 jQuery 1.7 版本之前,delegate() 用於綁定事件處理函數。在 jQuery 1.7 版本之後,被 on() 取代。但它們在阻止事件冒泡時有些許不同:
1. delegate()
delegate() 的使用方式類似於 on(),可以綁定多個事件處理函數,多個事件用逗號隔開。如果希望阻止事件冒泡,需要在處理函數內部使用 e.stopPropagation() 或返回 false。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用delegate()添加事件處理函數
$("#outer").delegate("#inner", "click", function(e) {
e.stopPropagation();
console.log("Inner clicked");
});
$("#outer").delegate("#outer", "click", function() {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過調用 e.stopPropagation(),我們只阻止了事件在 inner 元素上的冒泡,因此沒有觸發外部元素上的 click 事件。
2. on()
on() 可以通過事件委託的方式來綁定事件處理函數,可以將事件處理函數綁定到父級元素上。如果希望阻止事件冒泡,需要在處理函數內部使用 e.stopPropagation() 或返回 false。例如:
<div id="outer">
<div id="inner">Some text</div>
</div>
// 使用on()添加事件委託
$("#outer").on("click", "#inner", function(e) {
e.stopPropagation();
console.log("Inner clicked");
});
$("#outer").on("click", "#outer", function() {
console.log("Outer clicked");
});
當點擊 inner 元素時,console 中只會輸出 “Inner clicked”,而不會輸出 “Outer clicked”。通過調用 e.stopPropagation(),我們只阻止了事件在 inner 元素上的冒泡,因此沒有觸發外部元素上的 click 事件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/291157.html