Câu trả lời:
stopPropagation
sẽ ngăn bất kỳ trình xử lý cha mẹ nào được thực thi stopImmediatePropagation
sẽ ngăn bất kỳ trình xử lý cha mẹ nào và bất kỳ trình xử lý nào khác thực thi
Ví dụ nhanh từ tài liệu jquery:
$("p").click(function(event) {
event.stopImmediatePropagation();
});
$("p").click(function(event) {
// This function won't be executed
$(this).css("background-color", "#f00");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>example</p>
Lưu ý rằng thứ tự của ràng buộc sự kiện là quan trọng ở đây!
Một ví dụ nhỏ để chứng minh làm thế nào cả hai điểm dừng lan truyền này hoạt động.
Có ba xử lý sự kiện ràng buộc. Nếu chúng ta không dừng bất kỳ sự lan truyền nào, thì sẽ có bốn cảnh báo - ba trên div con và một trên div cha.
Nếu chúng ta ngăn sự kiện lan truyền, thì sẽ có 3 cảnh báo (tất cả nằm trên div con bên trong). Vì sự kiện sẽ không truyền bá hệ thống phân cấp DOM, nên cha mẹ sẽ không thấy nó và trình xử lý của nó sẽ không kích hoạt.
Nếu chúng ta ngừng nhân giống ngay lập tức, thì sẽ chỉ có 1 cảnh báo. Mặc dù có ba trình xử lý sự kiện được gắn vào div con bên trong, chỉ có 1 được thực thi và bất kỳ sự lan truyền nào khác sẽ bị giết ngay lập tức, ngay cả trong cùng một phần tử.
stopPropagation()
biến thể cũng sẽ ngừng truyền xuống hệ thống phân cấp DOM. Không chỉ lên. Vui lòng kiểm tra câu trả lời của tôi để biết chi tiết với giai đoạn chụp.
Từ API jQuery :
Ngoài việc giữ cho bất kỳ trình xử lý bổ sung nào trên một phần tử không được thực thi, phương thức này cũng ngăn chặn hiện tượng sủi bọt bằng cách gọi ngầm event.stopPropagation (). Để đơn giản ngăn sự kiện sủi bọt vào các phần tử tổ tiên nhưng cho phép các trình xử lý sự kiện khác thực thi trên cùng một phần tử, chúng ta có thể sử dụng event.stopPropagation ().
Sử dụng event.isImmediatePropagationStopped () để biết liệu phương thức này có được gọi hay không (trên đối tượng sự kiện đó).
Tóm lại: event.stopPropagation()
cho phép các trình xử lý khác trên cùng một phần tử được thực thi, trong khi event.stopImmediatePropagation()
ngăn mọi sự kiện chạy.
event.stopImmediatePropagation
không ngừng sủi bọt phải không?
stopImmediatePropagation
ngăn sự kiện không được lan truyền, cả hai sẽ ngăn chặn sự sủi bọt, không có gì thay đổi khi bạn cũng có thể thay đổi chế độ để bắt các phần tử ngoài cùng trước và chỉ sau đó đi xuống cho trẻ em (bong bóng là mặc định và hoạt động theo hướng ngược lại)
event.stopPropagation
sẽ ngăn chặn các trình xử lý trên các phần tử cha chạy.
Gọi event.stopImmediatePropagation
cũng sẽ ngăn các trình xử lý khác trên cùng một phần tử chạy.
Tôi là một người đến muộn, nhưng có lẽ tôi có thể nói điều này với một ví dụ cụ thể:
Nói, nếu bạn có một <table>
, với <tr>
, và sau đó <td>
. Bây giờ, giả sử bạn đặt 3 trình xử lý sự kiện cho <td>
phần tử, sau đó nếu bạn thực hiện event.stopPropagation()
trong trình xử lý sự kiện đầu tiên mà bạn đã đặt <td>
, thì tất cả các trình xử lý sự kiện <td>
sẽ vẫn chạy , nhưng sự kiện sẽ không lan truyền đến <tr>
hoặc <table>
(và sẽ không đi lên và lên đến <body>
, <html>
, document
, vàwindow
).
Bây giờ, tuy nhiên, nếu bạn sử dụng event.stopImmediatePropagation()
trong xử lý sự kiện đầu tiên của bạn, sau đó, hai xử lý sự kiện khác để <td>
sẽ không chạy , và sẽ không lan truyền đến <tr>
, <table>
(và sẽ không đi lên và lên đến <body>
, <html>
, document
, vàwindow
).
Lưu ý rằng nó không chỉ dành cho <td>
. Đối với các yếu tố khác, nó sẽ theo cùng một nguyên tắc.
1) event.stopPropagation():
=> Nó chỉ được sử dụng để dừng thực thi trình xử lý cha mẹ tương ứng.
2) event.stopImmediatePropagation():
=> Nó được sử dụng để dừng việc thực thi trình xử lý cha mẹ tương ứng của nó và cũng là trình xử lý hoặc chức năng gắn liền với chính nó ngoại trừ trình xử lý hiện tại. => Nó cũng dừng tất cả trình xử lý được gắn vào phần tử hiện tại của toàn bộ DOM.
Dưới đây là ví dụ: Jsfiddle !
Cảm ơn, -Silil
event.stopPropagation () cho phép các trình xử lý khác trên cùng một phần tử được thực thi, trong khi event.stopImmediatePropagation () ngăn mọi sự kiện chạy. Ví dụ, xem khối mã jQuery bên dưới.
$("p").click(function(event)
{ event.stopImmediatePropagation();
});
$("p").click(function(event)
{ // This function won't be executed
$(this).css("color", "#fff7e3");
});
Nếu event.stopPropagation đã được sử dụng trong ví dụ trước, thì sự kiện nhấp tiếp theo trên phần tử p làm thay đổi css sẽ kích hoạt, nhưng trong trường hợp event.stopImmediatePropagation () , sự kiện p click tiếp theo sẽ không kích hoạt.
Đáng ngạc nhiên, tất cả các câu trả lời khác chỉ nói một nửa sự thật hoặc thực sự sai!
e.stopImmediatePropagation()
ngăn chặn bất kỳ xử lý tiếp theo được gọi cho sự kiện này, không có ngoại lệe.stopPropagation()
là tương tự, nhưng vẫn gọi tất cả các trình xử lý cho giai đoạn này trên phần tử này nếu chưa được gọiGiai đoạn nào?
Ví dụ: một sự kiện nhấp chuột sẽ luôn luôn đi xuống DOM (được gọi là Giai đoạn bắt giữ giai đoạn), cuối cùng cũng đến nguồn gốc của sự kiện (mục tiêu pha Pha) và sau đó nổi lên một lần nữa (bong bóng pha Pha). Và với addEventListener()
bạn có thể đăng ký nhiều trình xử lý cho cả giai đoạn chụp và bong bóng một cách độc lập. (Pha đích gọi các trình xử lý của cả hai loại trên mục tiêu mà không phân biệt.)
Và đây là những gì các câu trả lời khác không chính xác về:
Một lời giải thích giai đoạn sự kiện fiddle và mozilla.org với bản demo.
Ở đây tôi đang thêm ví dụ về JSfiddle của mình cho stopPropagation so với stopImmediatePropagation. NHANH CHÓNG
let stopProp = document.getElementById('stopPropagation');
let stopImmediate = document.getElementById('stopImmediatebtn');
let defaultbtn = document.getElementById("defalut-btn");
stopProp.addEventListener("click", function(event){
event.stopPropagation();
console.log('stopPropagation..')
})
stopProp.addEventListener("click", function(event){
console.log('AnotherClick')
})
stopImmediate.addEventListener("click", function(event){
event.stopImmediatePropagation();
console.log('stopimmediate')
})
stopImmediate.addEventListener("click", function(event){
console.log('ImmediateStop Another event wont work')
})
defaultbtn.addEventListener("click", function(event){
alert("Default Clik");
})
defaultbtn.addEventListener("click", function(event){
console.log("Second event defined will also work same time...")
})
div{
margin: 10px;
}
<p>
The simple example for event.stopPropagation and stopImmediatePropagation?
Please open console to view the results and click both button.
</p>
<div >
<button id="stopPropagation">
stopPropagation-Button
</button>
</div>
<div id="grand-div">
<div class="new" id="parent-div">
<button id="stopImmediatebtn">
StopImmediate
</button>
</div>
</div>
<div>
<button id="defalut-btn">
Normat Button
</button>
</div>