2010-12-13 28 views
11

Tôi đang sử dụng mã sau để tạo hoạt ảnh cho một khối. Trong mã của tôi, div_animate() về cơ bản ẩn một số <div> với bộ chọn được chỉ định nếu nó hiện đang hiển thị.Làm cách nào để sử dụng jQuery để xác định xem sự kiện nhấp có kích hoạt trong một phần tử cụ thể không?

$(document).click(function(event){ 
    div_animate("#container"); 
}); 

tôi cần phải xác định xem người dùng nhấp vào một đứa trẻ của #container và nếu như vậy, return false; - như xa như tôi có thể nói, các mã này sẽ giống như thế này:

$(document).click(function(event){ 
    if (/* the event's target has a parent of #container */) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Bất kỳ suy nghĩ nào?

+0

Đây có phải là vấn đề tương tự như [câu hỏi trước của bạn] (http://stackoverflow.com/questions/4430277/jquery-animate-when-div-loses-focus) nơi tôi đã cho bạn [liên kết này] (http://stackoverflow.com/questions/714471/jquery-hide-element-when-clicked-anywhere-on- trang)? – user113716

+0

@patrick Điều này không giống như câu hỏi trước của tôi, nhưng nó có liên quan - vấn đề này phát sinh khi tôi thêm giải pháp từ câu hỏi trước. Trong khi liên kết của bạn tương tự như câu hỏi ban đầu của tôi, tôi không thấy nó hữu ích. – Jazzerus

Trả lời

26

Điều đơn giản nhất sẽ là:

if ($(event.target).is('#container *, #container')) // edited - thanks @gnarf 
    // is a child 
else 
    // is not a child 

Có những lựa chọn khác nhau mà bạn có thể làm cho việc phát hiện cho dù đó là một đứa trẻ trong những mục tiêu (hoặc không phải mục tiêu) chứa; đó chỉ là một. Một thay thế:

if ($(event.target).closest('#container').length) 
+1

Điều đó sẽ không tự tìm thấy '# container' ... Có lẽ' $ (event.target) .closest ('# container'). Length' hoặc '.is ('# container, #container *') ' – gnarf

+1

Đây chính là điều tôi muốn. Cảm ơn vì sớm phản hồi! – Jazzerus

+1

@gnarf ah vâng, bạn đã đúng - tôi đã thêm thay thế "gần nhất" quá nhưng tôi sẽ sửa lỗi đầu tiên. – Pointy

8

Bạn có thể ngăn chặn hành động nếu nhấp chuột có nguồn gốc trên hoặc trong #container, như thế này:

$(document).click(function(event){ 
    var c = $("#container")[0]; 
    if (event.target == c || $.contains(c, event.target)) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Các kiểm tra đầu tiên là nếu nó đến từ #container bản thân, thứ hai là nếu nó đến từ một đứa trẻ, rằng #container$.contains(). Một cách đơn giản hoàn toàn thay thế là chỉ cần ngăn chặn bong bóng lên đến document khi nhấp vào #container, như thế này:

$("#container").click(function(e) { 
    e.stopPropagation(); 
}); 
$(document).click(function() { 
    div_animate("#container"); 
}); 
+0

Đây là cơ hội vàng của tôi để chastise bạn cho bộ nhớ đệm không "#container" tra cứu, nhưng tôi đặt cược bạn sẽ có chỉnh sửa nó bằng thời gian tôi kết thúc gõ bình luận này :-) – Pointy

+0

@Pointy - Nó được lưu trữ như là một yếu tố DOM trong phiên bản đầu tiên được đăng ... –

+0

Không, tôi có nghĩa là lưu trữ trong một đóng cửa xung quanh chức năng xử lý hoặc một cái gì đó, mặc dù chủ yếu là tôi chỉ đùa thôi. – Pointy

Các vấn đề liên quan