2011-07-22 148 views
6

我試圖設置這個「當您單擊的元素之外,關閉」類型的東西使用一些代碼,我就發現了#1:有人可以解釋這個stopPropagation是如何工作的嗎?

$(document).click(function() { 
$('.list-to-hide').hide(); 
}); 

$('.show-list-button').click(function(event) { 
event.stopPropagation(); 
}); 

有人能解釋與stopPropagation後期?我不明白爲什麼需要它。

謝謝! 馬特

回答

32

想象一下:

<div> 
    DIV 
    <span> 
     Span 
    </span> 
<div> 

和:

$('div').click(function() { alert('div clicked'); }); 
$('span').click(function() { alert('span clicked'); }); 

Check out what happens when you click each one

當您單擊的跨度,它正好也觸發格,因爲你也可以點擊股利。

現在,如果我們想提醒跨度我們需要從觸發,當我們點擊跨度停止DIV點擊所以我們這樣做:

$('div').click(function() { alert('div clicked'); }); 
$('span').click(function(e) { alert('span clicked'); e.stopPropagation(); }); 

See what happens now

+0

這是一個非常好的和易於理解的演示!真的有幫助! – Kumar

1

你看過這個嗎?

http://api.jquery.com/event.stopPropagation/

它會阻止事件冒泡DOM樹,阻止任何父處理程序被通知的事件。

殺死上點擊事件冒泡。

$("p").click(function(event){ 
    event.stopPropagation(); 
    // do something 
}); 
3

event.stopPropagation();防止事件冒泡DOM。沒有這一行,點擊.show-list-button文檔的點擊處理程序也會觸發。有了它,文檔點擊不會觸發。

8

您的示例代碼中缺少的重要組成部分:

$(document).click(function() { 
    $('.list-to-hide').hide(); 
}); 

$('.show-list-button').click(function(event) { 
    event.stopPropagation(); 
    $('.list-to-hide').show(); 
}); 

沒有event.stopPropagation(),它會顯示在列表中,然後隱藏它,因爲.show-list-button$(document)這樣既單擊處理將開火。 event.stopPropagation()基本上說只適用於這個點擊事件這個孩子節點並不告訴父容器什麼,因爲我不想讓他們反應

想想這樣 - 你租一輛出租車爲100美元。司機給他的公司80美元。 event.stopPropagation()就像告訴他要保留所有100美元,因爲公司不需要知道關於乘坐的任何事情。

+0

好了,這是一個很好的解釋,但是說我點擊.show-list-button。爲什麼瀏覽器不會決定首先將其視爲文檔點擊?是否有一些稱重系統用於決定首先通知點擊哪個功能? – Matt

+0

欲瞭解更多材料,你最好看[事件順序](http://www.quirksmode.org/js/events_order.html)和http://stackoverflow.com/questions/2661199/event-capturing-vs-event -bubbling/2667743#2667743 – Ghostoy

+4

+1爲妓女比喻。 – Fred

相關問題