2013-09-30 54 views
1

我有一個父元素,其上附有mouse upmouse down事件,以及附加了click事件的子元素。防止childup在父母后的onclick?

在家長觸發mouseup事件後,有什麼辦法可以防止兒童發生click事件?

一個例子,在JSfiddle here,目標是讓內部正方形不會變成綠色,如果我點擊它。

理想情況下,我想不做修改$('#inner').on('click', function(){})。我已經知道我可以在mouseup上設置一個布爾值,並在click上檢查它,但我試圖找到一種方法來做到這一點,而無需修改點擊事件。

使用jquery(或任何其他庫)是選項,我沒有任何限制,除非不修改click方法。

編輯

感謝@adeneo您的建議,這看起來很有希望,但它讓我意識到我錯過了問題的一個重要組成部分。在mouseup裏面會有一個有條件的檢查,看看是否應該阻止點擊。如果我刪除了該事件,我可以在避免點擊之後以某種方式將其添加回來?例如,在setTimeout中。我不知道如何(或者如果有可能)獲得對已刪除的click函數的引用,然後重新添加處理程序。

希望這new fiddle here幫助我解釋一點點更好!

+0

你不能沒有修改它禁用單擊事件處理程序。一旦mouseup激發,你必須使用off()來移除事件處理程序? – adeneo

+0

http://jsfiddle.net/6gw4x/30/ – adeneo

+0

你好,請檢查更新的小提琴 http://jsfiddle.net/6gw4x/32/ 和我的EDITTED在這篇文章中回答 –

回答

0
$('#inner').on('mouseup', function(e) {  
     $(this).unbind("click"); 
     $(this).css({'background': 'black'});  
}); 

你試過這樣嗎?

+0

這似乎是正確的方法,但它導致我另一個問題。我更新了我的問題!謝謝! – caiocpricci2

0

嘗試e.stopImmediatePropagation();在你的內部代碼中。

+0

這似乎不起作用,你能請更新小提琴與工作樣品? – caiocpricci2

0

只需用下面的代碼替換你的代碼並檢查。要停止內部div的單擊事件,可以使用preventDefault()或stopPropagation()。請檢查下面

$('#inner').on('click', function(e) {  
    $(this).stopPropagation(); 
    // or 
    // $(this).preventDefault(); 
    alert('inner click'); 
}); 

$('#outer').on('mousedown', function(e) { 
    $(this).css({'background': 'green'}); 
}); 

$('#outer').on('mouseup', function(e) { 
    $(this).css({'background': 'yellow'}); 


}); 
+0

#outer元素中沒有點擊事件。只有鼠標向上和鼠標向下。我試圖阻止點擊#inner元素,而不是其他方式。 – caiocpricci2

+0

jquery對象沒有停止傳播方法,你所做的只是向代碼添加一個錯誤。我知道你正在嘗試提供幫助,但至少要測試你發佈的代碼。 – caiocpricci2

0

我敢肯定,這就是你要找的答案:

$($(this)).children().click(function (event) { // Preveu la propagació del click als fills 
       // event.stopPropagation(); 
      }); 
+0

一直以來我的答案是有益的? – Despertaweb