2012-01-10 32 views
21

Tôi đang cố gắng làm cho trình đơn thả xuống của tôi hiển thị khi bạn nhấp vào nút và ẩn khi bạn nhấp vào bất kỳ đâu ngoại trừ trình đơn thả xuống.jQuery ẩn danh sách thả xuống khi được nhấp vào bất kỳ đâu nhưng menu

Tôi có một số mã hoạt động, miễn là bạn không đóng khi bạn nhấp vào menu, tuy nhiên khi bạn nhấp vào tài liệu khi menu được đóng, trình đơn sẽ hiển thị menu, vì vậy nó liên tục chuyển đổi bất kể bạn nhấp vào đâu.

$(document).click(function(event) { 
    if ($(event.target).parents().index($('.notification-container')) == -1) { 
     if ($('.notification-container').is(":visible")) { 
      $('.notification-container').animate({ 
       "margin-top": "-15px" 
      }, 75, function() { 
       $(this).fadeOut(75) 
      }); 
     } else { 
      //This should only show when you click: ".notification-button" not document 
      $('.notification-container').show().animate({ 
       "margin-top": "0px" 
      }, 75); 
     } 
    } 
}); 
+0

Để mô tả mã của bạn; Nó liên kết sự kiện click với toàn bộ 'document' và khi sự kiện đó được kích hoạt, nó sẽ kiểm tra nếu phần tử target (click) có bất kỳ cha mẹ nào có class" .notification-container "và nếu nó kiểm tra nếu bất kỳ phần tử nào với lớp đó có thể nhìn thấy. Nếu vậy, nó ẩn (animates) tất cả các phần tử với lớp ".notification-container" và nếu không nó sẽ hiển thị (animates) chúng thay thế. – Stefan

+0

Giải pháp tốt nhất hiện có là [stackoverflow.com/questions/152975/how-to-detect-a-click-outside-an-element][1]. [1]: http://stackoverflow.com/questions/152975/how-to-detect-a-click-outside-an-element – lightofsouls

+0

hey người đàn ông, bạn sẽ nhớ chấp nhận một câu trả lời? :) – epoch

Trả lời

2

Đây là những gì tôi đã quyết định sử dụng, đó là một plugin jQuery nhỏ tuyệt vời hoạt động với ít mã.

Đây là plugin: http://benalman.com/projects/jquery-outside-events-plugin/

Đây là mã mà làm cho mã trên của tôi trong công việc câu hỏi của tôi.

$(document).ready(function(){ 
    $(".notification-button").click(function(){ 
     $('.notification-container').toggle().animate({"margin-top":"0px"}, 75); 
    }); 

    $('.notification-wrapper').bind('clickoutside', function (event) { 
     $('.notification-container').animate({"margin-top":"-15px"}, 75, function(){$(this).fadeOut(75)}); 
    }); 
}); 
4

Tôi thường làm như thế này:

$('.drop-down').click(function() { 
    // The code to open the dropdown 

    $('body').click(function() { 
     // The code to close the dropdown 
    }); 
}); 

Vì vậy, đặt cơ thể của bạn (ở nơi khác) bấm chức năng bên trong trình đơn thả xuống chức năng mở nhấp chuột.

+0

Điều này dường như vẫn làm điều tương tự như mã hiện tại của tôi, thật kỳ quặc.Nhưng cảm ơn bạn –

29

closest() chức năng của jQuery có thể được sử dụng để xem các nhấp chuột không nằm trong menu:

$('body').click(function(e) { 
    if ($(e.target).closest('.notification-container').length === 0) { 
     // close/animate your div 
    } 
}); 
+0

Tôi đã không thể làm điều này để làm việc như mong đợi, nó không giống như nó với mã hiện tại của tôi –

+0

Điều này rất đơn giản và hoạt động tốt. Bạn có thể muốn xem xét thêm sự kiện nhấp vào html thay vì nội dung trong trường hợp trang của bạn không lấp đầy chiều cao đầy đủ của khung nhìn –

+0

công trình này tuyệt vời :) – mshahbazm

1

thử một cái gì đó như:

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

if($(event.target).parents().index($('.notification-container')) == -1) { 
    if($('.notification-container').is(":visible")) { 
     $('.notification-container').animate({"margin-top":"-15px"}, 75, function({$(this).fadeOut(75)}); 
    } 
}   
}); 

$(".notification-button").click(function(event){ 
    event.stopPropagation(); 
    $('.notification-container').show().animate({"margin-top":"0px"}, 75); 
}); 
+0

Vâng tôi đã thử điều này, nó không hoạt động chút nào. –

+0

lạ. nếu bạn có thể đăng các phần liên quan của mã của bạn tại http://jsfiddle.net/ nó sẽ dễ dàng hơn nhiều để tìm ra điều này – redmoon7777

7

bạn có thể làm một cái gì đó như thế này nếu hàng của bạn không phải là sau đó nhấp vào danh sách thả của nó trong trường hợp thả xuống

$(':not(#country)').click(function() { 
    $('#countrylist').hide(); 
}); 
+1

Tôi đã làm điều này trước đây, nhưng nó không bao giờ làm việc chính xác phải –

2

Hãy thử thứ là:

// The code to close the dropdown 
$(document).click(function() { 
    ... 
}); 

// The code to open the dropdown 
$(".drop-down").click(function() { 
    ... 
    return false; 
}); 
2

Điều này có thể không phải là một giải pháp hoàn chỉnh nhưng Tôi đã tạo ra một demo để giúp bạn ra ngoài. Hãy cho tôi biết nó không hoạt động như bạn mong đợi.

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

    var isModalBox = (e.target.className == 'modal-box'); 

    if (!isModalBox) { 
     $('.modal-box:visible').animate({ 
      "margin-top": "-15px" 
     }, 75, function() { 
      $(this).fadeOut(75); 
     }); 
    } 
}); 

$('a').click(function(e) { 
    e.stopPropagation(); // Important if you´d like other links to work as usual. 
}); 

$('#temp-button').click(function(e) { 
    e.preventDefault(); 
    $('.modal-box').show().animate({ 
     "margin-top": "0px" 
    }, 75); 
}); 
+0

Điều đó dường như làm việc như nó nên trong bản demo fiddle của bạn, cảm ơn. Nhưng tôi tìm thấy một plugin hoạt động hoàn hảo, với ít mã hơn, tôi sẽ đăng nó như là câu trả lời của tôi. –

5

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('#dropdownID').length != 0) return false; 
    $('#dropdownID').hide(); 
}); 

Hy vọng nó sẽ hữu ích.

Cảm ơn !!

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