2012-04-15 19 views
18

Tôi có HTML sau:jQuery Nhấn tổ chức sự kiện On Div, Trừ Child Div

<div class="server" id="32"> 
    <a>Server Name</a> 
    <div class="delete-server">X</div> 
</div> 

tôi đang cố gắng để làm cho nó như vậy khi người dùng nhấp vào div server nó sẽ trả về một hộp thoại chỉnh sửa. Vấn đề chỉ đơn giản là làm:

$(".server").click(function() { 
    //Show edit dialog 
}); 

Không hoạt động, bởi vì nếu họ nhấp vào X xóa, nó sẽ trả về hộp thoại chỉnh sửa. Cách làm cho toàn bộ div server có sự kiện nhấp ngoại trừ số delete-server div.

+0

Bạn nên biết rằng câu trả lời được chấp nhận của bạn sử dụng phần tử ủy nhiệm nt không có lý do chính đáng. bạn có thể đọc 'on' [docs] (http://api.jquery.com/on/) để tìm hiểu nó. – gdoron

+0

@gdoron - Bạn có thể vui lòng cung cấp nguồn cho khiếu nại của bạn rằng ủy quyền sự kiện chậm hơn không? AFAIK, đoàn đại biểu sự kiện làm điều tương tự bạn đã làm, nhưng đằng sau hậu trường; nó sẽ kiểm tra xem phần tử đích có khớp với bộ chọn đã cho hay không. Mặc dù tôi có thể sai, và rất muốn được chứng ngộ. –

+0

http://stackoverflow.com/questions/12690313/jquery-on-click-on-everything-but-a-div-and-its-children/12690357 –

Trả lời

21
$(".server").on('click', ':not(.delete-server)', function (e) { 
    e.stopPropagation() 
    // Show edit dialog 
}); 

Đây là fiddle: http://jsfiddle.net/9bzmz/3/

+0

cảm ơn tôi đã học được điều gì đó mới từ nó .. :-) – Peeyush

+0

Thông báo, nhấp vào MÁY CHỦ TÊN, tại sao cảnh báo lại kích hoạt hai lần? http://jsfiddle.net/9bzmz/1/ – Justin

+0

@Justin vậy có hiển thị 2 hộp cảnh báo ở bên cạnh bạn khi nhấp vào Tên MÁY CHỦ không? – Peeyush

12

Chỉ cần kiểm tra các yếu tố người gây ra sự kiện này là gì:

$(".server").click(function(e) { 
    if (!$(e.target).hasClass('delete-server')) { 
     alert('Show dialog!'); 
    } 
});​ 

LIVE DEMO

+0

liên quan vẫn thấy hộp thoại chỉnh sửa sắp xuất hiện khi nhấp vào X, tôi nghĩ điều này là do sự kiện nhấp chuột được kích hoạt trên '.server' để nó không biết về div con' .delete-server'. – Justin

+0

@Justin. Kiểm tra câu trả lời được cập nhật. Bạn nên biết rằng câu trả lời được chấp nhận của bạn làm cho một 'sự kiện đại diện' thay vì' sự kiện trực tiếp', mà là chậm hơn, và không có lý do để làm điều đó. sự kiện ủy nhiệm nên được sử dụng để thay đổi cấu trúc DOM động. – gdoron

+0

Bạn có thể vui lòng cung cấp nguồn cho khiếu nại của mình rằng ủy quyền sự kiện chậm hơn không? AFAIK, đoàn đại biểu sự kiện làm điều tương tự bạn đã làm, nhưng đằng sau hậu trường; nó sẽ kiểm tra xem phần tử đích có khớp với bộ chọn đã cho hay không. Mặc dù tôi có thể sai, và rất muốn được chứng ngộ. –

6

Có một cách khác để giải quyết việc này:

$(".server").click(function() { 
    // show edit dialog 
}); 
$(".delete-server").click(function (event) { 
    // show delete dialog for $(this).closest(".server") 
    event.stopPropagation(); 
}); 

Chỉ cần đảm bảo sự kiện nhấp chuột được phát hành trên .delete-server không phát sinh đến phần tử gốc.

+0

+1 Cách tốt đẹp, mặc dù nó sử dụng hai trình xử lý trong khi nó có thể được thực hiện bằng cách kiểm tra phần tử 'target'. [kiểm tra điều này] (http://stackoverflow.com/a/10160231/601179) – gdoron

+0

@gdoron Vâng, nhưng đâu là sự thanh lịch trong điều này? Điều đó sẽ dẫn đến một trình xử lý sự kiện duy nhất với một 'if' /' switch' kiểm tra bên trong nó để xác định sự kiện là * thực sự * nghĩa vụ phải làm. Tôi muốn xem xét điều này khá hôi thối. – Tomalak

+0

Vâng .. không có cách nào sai, tôi thích tôi tốt hơn. Mỗi cách là tốt hơn sau đó là câu trả lời được chấp nhận trong đó sử dụng sự kiện đại biểu không có lý do chính đáng ... :) – gdoron

0

Chỉ tính năng này phù hợp với tôi.

js_object là jQuery đối tượng cho cha mẹ meta như một $('body')

jq_object.on('click', '.js-parent :not(.js-child-1, .js-child-2)', function(event) { 
    //your code 
}); 

jq_object.on('click', '.js-child-1', function(event) { 
    //your code 
}); 

jq_object.on('click', '.js-child-2', function(event) { 
    //your code 
}); 

Fore trường hợp của bạn:

máy chủ - js-mẹ

xóa-server - js-con-1

jq_object.on('click', '.server :not(.delete-server)', function(event) { 
    //your code 
}); 

jq_object.on('click', '.delete-server', function(event) { 
    //your code 
}); 
Các vấn đề liên quan