2010-02-24 72 views
37

Tôi đang cố gắng ẩn div nếu người dùng nhấp vào bất cứ nơi nào NHƯNG cửa sổ bật lên HOẶC đó là trẻ em. Đây là mã tôi có cho đến thời điểm này:jQuery: Ẩn cửa sổ bật lên nếu nhấp chuột được phát hiện ở nơi khác

$("body").click(function(){ 
    var $target = $(event.target); 
    if(!$target.is(".popup") || !$target.is(".popup").children()){ 
     $("body").find(".popup").fadeOut().removeClass('active'); 
    } 
}); 

Nó hoạt động cho div .popup, nhưng nếu có con nào được nhấp, nó sẽ ẩn nó.

Trả lời

77

Bạn thực sự có thể đơn giản hóa một chút này tôi nghĩ:

// If an event gets to the body 
$("body").click(function(){ 
    $(".popup").fadeOut().removeClass("active"); 
}); 

// Prevent events from getting pass .popup 
$(".popup").click(function(e){ 
    e.stopPropagation(); 
}); 

Nhấp vào popup, hoặc bất kỳ con của nó sẽ gây ra tác tuyên truyền để ngăn chặn trước khi nó đạt đến cơ thể.

Demo ngăn chặn sự kiện tuyên truyền: http://jsbin.com/ofeso3/edit

+2

Một đề xuất nhỏ là viết $ (". Popup: visible"). FadeOut(). RemoveClass ("active"); - Tôi đã có vấn đề nơi thứ xuất hiện lại chỉ để phai mờ một lần nữa. – ehdv

+0

Điều này có vẻ như một giải pháp tuyệt vời, tuy nhiên, tôi đang gặp sự cố khi có những thứ cần phải xảy ra trong cửa sổ bật lên dựa trên sự kiện nhấp chuột. Cụ thể, tôi có ứng dụng Rails và đang sử dụng: remote => true trên biểu mẫu trong cửa sổ bật lên. Trong trường hợp này, chức năng AJAX bị ngắt khi sử dụng e.stopPropagation(). Tôi đã tạo http://stackoverflow.com/questions/5904602/jquerys-event-stoppropagation-causing-problems-with-rails-remote-true trước khi tìm câu hỏi này. Bất kỳ cách nào xung quanh điều này? – robertwbradford

+0

... Tôi muốn nói "using a: method =>: delete,: remote => true trên liên kết 'hủy' liên kết trong cửa sổ bật lên ..." – robertwbradford

3

Làm nổi bật logic logic của bạn! :)

if(!$target.is(".popup") && !$target.parents().is(".popup")) 
+0

Tôi đã mong đợi '$ .fn.is' trả về giá trị boolean. Làm thế nào để nó rút ra phép thuật này? – Matchu

+0

hmm, bạn có thể đúng! Đã sửa. – ghoppe

1

Chúng tôi đang sử dụng này để hiển thị một popup nhấp chuột và sau đó ẩn nó khi bạn nhấp vào nút một lần nữa hoặc nhấp bên ngoài.

function togglePopup(){ 
    var selector = '#popup', 
    $popup = $(selector), 
    callback = function(e) { 
     if (!$(e.target).parents().andSelf().is(selector)) { 
     $popup.hide(); 
     $(document).off('click', callback); 
     } 
    }; 

    $popup.toggle(); 
    if ($popup.is(':visible')) { 
    $(document).on('click', callback); 
    } 
    return false; 
} 
1
$("body").click(function(event){ 
      var $target = $(event.target); 
      if(!$target.parents().is(".popup") && !$target.is(".popup")){ 
       $("body").find(".popup").hide(); 
      } 
     }); 

đây là giải pháp cho tôi

1

Tính đến jQuery 1.7 có các handler on(), các công trình sau đây đối với tôi, giả sử một thể nhìn thấy cửa sổ bật lên chứa các lớp '.activePopup':

$('body').on('click', ":not(.activePopup)", function(e){ 
    e.stopPropagation(); 
    //do your hiding stuff 
}); 
2

Đây là giải pháp tiềm năng cho một số trường hợp nhất định. Cửa sổ bật lên phải có tabindex được đặt để thao tác này hoạt động và không thể có bất kỳ phần tử "có thể lấy tiêu điểm" nào bên trong.

$('a').click(function() { 
    $('.popup').show().focus(); 
}); 
$('.popup').blur(function() { 
    $(this).hide(); 
}); 

http://jsfiddle.net/d6zw3/

+0

Mã này không phù hợp theo câu hỏi. –

6

Tôi đang sử dụng một mã rất đơn giản cho điều này như sau: -

$(document).click(function(e){ 

    if($(e.target).closest('#popupdivID').length != 0) return false; 
    $('#popupdivID').hide(); 
}); 

này cũng hữu ích cho trình đơn thả xuống. nếu bạn đã nhấp vào menu thả xuống và xem danh sách và sau đó nhấp vào nơi khác trong tài liệu thì trình đơn thả xuống đó sẽ bị đóng. Tôi đã sử dụng cùng một mã cho điều đó.

Cảm ơn !!

+0

giải pháp tốt nhất, khác sẽ ngừng tất cả các nhấp chuột liên kết bên trong popup – baaroz

1

Dưới đây là đoạn mã có thể giúp cho một cấu trúc html

<script> 
jQuery(document).click(function() { 
     jQuery(".main-div-class .content").css("display","none"); 
    }); 

    jQuery(".main-div-class .content").click(function (e) { 
     e.stopPropagation(); 
     //do redirect or any other action on the content 
    });  
    jQuery(".main-div-class h4").click(function(e) { 
     e.stopPropagation(); 
     jQuery(this).parent().find(".content").show(); 
    }); 
</script> 
<div class="main-div-class"> 
<h4>click here</h4> 
<div class='content'>to show content here like this "<a href="http://stackoverflow.com/questions/2329816/jquery-hide-popup-if-click-detected-elsewhere#new-answer">Click</a>" or any other type of content</div> 
</div> 
+0

Chúng tôi cũng có thể thêm mã này trong jQuery (tài liệu) .ready (function() {}); –

1

để cập nhật mã có thể được như thế này

<script type="text/javascript"> 
jQuery(document).ready(function(e) { 
jQuery(document).click(function() { 
     jQuery(".main-div-class .content").css("display","none"); 
    }); 

    jQuery(".main-div-class .content").click(function (e) { 
     e.stopPropagation(); 
     //do redirect or any other action on the content 
    });  
    jQuery(".main-div-class h4").click(function(e) { 
     e.stopPropagation(); 
     jQuery(this).parent().find(".content").show(); 
    }); 
}); 
</script> 
<div class="main-div-class"> 
<h4>click here</h4> 
<div class='content'>to show content here like this "<a href="http://stackoverflow.com/questions/2329816/jquery-hide-popup-if-click-detected-elsewhere#new-answer">Click</a>" or any other type of content</div> 
</div> 
3

Làm điều này:

$(document).click(function (e) { 
    // show_alerts is the class of the link to display the popup 
    if (!$(e.target).parents().andSelf().is('.show_alerts')) { 
     // hide your popup 
    } 
}); 

dụ: http://jsfiddle.net/Acf3F/

1

Tôi đã có vấn đề với tất cả các giải pháp ở đây, vì vậy sau một số thất vọng; Tôi tiếp cận vấn đề theo một hướng hơi khác.

Tôi đặc biệt không thích gắn các sự kiện nhấp vào nội dung hoặc tài liệu và sự kiện. Mục tiêu không đủ tin cậy. Tôi cũng không muốn sử dụng stopPropagation() vì tôi không muốn can thiệp vào các sự kiện khác.

Đây là cách tôi giải quyết nó, hy vọng nó sẽ giúp:

Markup

<div id="ModalBG"></div> 
<div id="Modal">Content Here</div> 


Javascript

function showModal(){ $("#Modal, #ModalBG").show(); } 

$("#ModalBG").click(function() { $("#Modal, #ModalBG").hide() }); 


CSS

#Modal{ 
    z-index: 99; 
} 


#ModalBG{ 
    opacity: 0; 
    position: fixed; 
    top: 0px; 
    left: 0px; 
    bottom: 0px; 
    right: 0px; 
    width: 100%; 
    height: 100%; 
    z-index: 98; 
    display: none; 
} 
Các vấn đề liên quan