2012-03-15 149 views
3

我試圖做到這一點,當他們點擊一個<tr>它會打開一個對話框,工作得很好。然而在這<tr>我有一個輸入複選框,我需要讓他們點擊而不打開對話框。這怎麼可能?Jquery .click事件

$('#messageContainer tr').click(function() { 
    var masterMessageID = $(this).attr('messageID'); 
    var replyToID = $(this).attr('replyToID'); 

    buildDialog(this.id, masterMessageID, replyToID); 
    $(this).removeClass('messageNew'); 
}); 

HTML:

<tr replytoid="3" messageid="7078" id="16"> 
    <td>&nbsp;&nbsp;<input type="checkbox" name="checkAll"></td> 
    <td>John Doe</td> 
    <td>sdfsdf</td> 
    <td>3/14/2012 1:29:47 PM</td> 
</tr> 

回答

6

停止點擊的傳播:

$('#messageContainer tr :checkbox').click(function(e){ 
    e.stopPropagation(); 
}); 
+0

它會起作用冒泡事件嗎?如果這些事件冒泡了,不會首先調用tr click嗎? – 2012-03-15 16:05:49

+0

@SKS事件冒起來,而不是下降。 – 2012-03-15 16:09:00

+0

@RichardD我想你應該檢查http://www.quirksmode.org/js/events_order.html – 2012-03-15 16:11:43

0

編輯:.is(':checkbox')更改爲檢查e.target.type

DEMO

$('#messageContainer tr').click(function (e) { 
    if (e.target.type && e.target.type == 'checkbox') { 
     e.stopPropagation(); //stop bubbling 
     return; 
    } 

    var masterMessageID = $(this).attr('messageID'); 
    var replyToID = $(this).attr('replyToID'); 

    buildDialog(this.id, masterMessageID, replyToID); 
    $(this).removeClass('messageNew'); 
}); 
+0

或只是'。不是(...)' – Alnitak 2012-03-15 16:00:32

+0

@Alnitak我試過。不是(),但不能讓它正常工作。 – 2012-03-15 16:16:30

+0

@JamesWilson我認爲Guffa有更好的解決方案。如果您不想要額外的處理程序,請參閱上面的編輯。 – 2012-03-15 16:18:19

1

您可以添加以下代碼:

$('#messageContainer tr input:checkbox').click(function (e) { 
    e.stopPropagation(); 
}); 

這將傳播到TR停在複選框點擊。

示例 - http://jsfiddle.net/U5LBR/1/

0

入住這

在複選框添加event.stopPropagation()。它會阻止事件冒泡。

$('#messageContainer tr').click(function() { 
$('#popup').toggle(); 
}); 

$('#messageContainer input[type="checkbox"]').click(function(e){ 
alert('Checked'); 
e.stopPropagation(); 

}) 

http://jsfiddle.net/JLDzq/1/

+0

我不太熟悉冒泡。第一個答案只是增加了'e.stopPropagation();'無論好還是壞? – 2012-03-15 16:10:04

+0

第一個答案是這樣做的。 – 2012-03-15 16:47:33