2012-08-09 78 views
1

我有一個子類body_left_details的子div,它位於父類div body_left_bar中。這兩個div都附有onclick事件,但是當您點擊body_left_details時,我想阻止body_left_bar冒泡。以下是相關代碼:javascript stopPropagation()阻止函數被觸發

$(function() { 
    $('.body_left_bar').click(function() { 
     body_right_load('parent'); 
    }) 
    $('.body_left_details').click(function(e) { 
     e.stopPropagation(); 
     body_right_load('child'); 
    }) 
}) 
function body_right_load(str) { 
    alert(str); 
}​ 

夠簡單。但爲什麼當我點擊body_left_details時,body_right_load('child')沒有被調用?我在e.stopPropagation()之後直接測試了一個alert(),並且它工作正常。停止傳播後是否允許外部功能?這會被認爲是冒泡嗎?

在Chrome中測試Windows 7 wamp。任何洞察讚賞!編輯:Relevant jsfiddle。點擊父div將導致警報,但點擊「閱讀有關」不會產生任何結果。

+3

它可能與'body_right_load()'*真正*聲明的方式有關。如果它真的看起來像你發佈的內容,它會起作用。 – Pointy 2012-08-09 17:13:38

+0

請提供演示此問題的小提琴。 – Niko 2012-08-09 17:15:28

+0

事實上,我已經略微減弱了總體佈局,但是我已經改變了body_right_load以顯示如上並且仍然不會觸發。給我一小把小提琴。 – 2012-08-09 17:16:06

回答

1
$(function() { 
    $('.body_left_bar').on('click', function() { 
     body_right_load('parent'); 
    }) 
    $('.body_left_details').on('click', function(e) { 
     e.stopImmediatePropagation(); 
     body_right_load('child'); 
    }) 
}) 
function body_right_load(str) { 
    alert(str); 
}​ 
+0

這與op代碼的執行有什麼不同? – Alxandr 2012-08-09 17:34:05

+1

http://api.jquery.com/on/「。通過調用event.stopPropagation(),處理程序可以防止事件進一步向上冒泡文檔樹(從而阻止處理這些元素的處理程序)。任何其他處理程序爲了防止發生這種情況,請調用event.stopImmediatePropagation()。(綁定到元素的事件處理程序按照與它們綁定的順序相同的順序調用)。「 – darthwade 2012-08-09 17:36:03

+1

我再問一次,那會怎樣?原始發佈代碼? '.body_left_details'沒有超過1個事件,因此使用'stopImmediatePropagation'不應該與'stopPropagation'形式不同,除了(我不確定這一點),看起來(從你粘貼的文檔中),'stopImmediatePropagation '仍然會在父元素上運行click-event(換句話說,它會傳播,而不是在同一元素上的處理程序),但我可能在這一點上是錯誤的。 – Alxandr 2012-08-09 17:39:42