2011-07-07 14 views
16

Mam div, który ześlizguje się po kliknięciu przycisku, i chciałbym, aby przesuwać się w górę div, gdy użytkownik:jQuery: Zamknij DIV, klikając dowolne miejsce poza samym DIV?

  1. kliknięcia anwhere wyjątkiem wewnątrz DIV samego
  2. Kliknij przycisk zamykania w ramach div.

Obecnie mam go na scenie, gdzie, kliknij element z klasą .panel-tab - to ześlizguje się panel z ID #panel ... Kliknij gdziekolwiek indziej to ślizga się ....

Oto mój kod tak daleko, aby uzyskać DIV do otwierania i zamykania:

<script type="text/javascript"> 
$(document).ready(function(){ 

$('.panel-tab').click(function(e) { 
    $("#panel").stop(true, true).slideToggle("slow"); 
    e.stopPropagation(); 
}); 

$("body").click(function() { 
    $("#panel:visible").stop(true, true).slideUp("slow"); 
});}); 
</script> 

Odpowiedz

20

można powiązać zdarzenie click do document i sprawdzić, czy zdarzenie click wydarzyło w ciągu tego div lub dzieci. Jeśli nie, zamknij to.

Czas wtyczki!

(function($){ 
    $.fn.outside = function(ename, cb){ 
     return this.each(function(){ 
      var $this = $(this), 
       self = this; 

      $(document).bind(ename, function tempo(e){ 
       if(e.target !== self && !$.contains(self, e.target)){ 
        cb.apply(self, [e]); 
        if(!self.parentNode) $(document.body).unbind(ename, tempo); 
       } 
      }); 
     }); 
    }; 
}(jQuery)); 

Wykorzystanie:

$('.panel-tab').outside('click', function() { 
    $('#panel').stop(true, true).slideUp('slow'); 
}); 
+0

dzięki za odpowiedź, przepraszam, ale to, co jest gotowy przykład za pomocą obu części podałeś? – CodeyMonkey

+0

@CodeyMonkey: cóż, wystarczy przeciągnąć "pierwszą część" do pliku '.js", dołączyć go do swojej witryny i użyć go tak, jak to zrobiłem w "drugiej części". Działa to z wszelkiego rodzaju wydarzeniami btw. – jAndy

+0

@jAndy: dlaczego po prostu nie zawsze wywołujesz zdarzenie i zatrzymujesz propagację na elemencie, który powinien pozostać otwarty? – meo

6

EDITHow to create a custom modal popup - and how to close it clicking outside of it


tu tylko przykładem kopalni: http://jsbin.com/uqiver/1/edit

$("body").on('click', function(ev) { 
    var myID = ev.target.id; 
    if (myID !== 'panel') { 
     $('#panel').hide(); 
    } 
}); 

Albo można również sprawdzić, czy jest to widoczne na pierwszy:

var $pan = $('#panel'); 

$("body").on('click', function(ev) { 
    if ($pan.is(':visible') && ev.target.id !== 'panel') $pan.hide(); 
}); 

+1

To jest niesamowity koleś! – tony

+0

@ Tony haha ​​dzięki Tony !! ;) –

1

chciałbym zrobić coś takiego

var $doc, $panel = $('.panel-tab'); 
$doc = $(document); 
$doc.bind("click", function(){ 
    $panel.hide(); 
    $doc.undbind("click"); 
}); 

$panel.bind("click", function(e){ 
    e.stopPropagation(); 
}); 

zawsze zamknąć kartę na kliknięcie na dokumencie, ale zatrzymasz zdarzenie z propagacji na karcie samo.

tutaj przykład roboczych: http://jsfiddle.net/meo/TnG4E/

+0

przykład nieobrobiony TUTAJ: http://jsfiddle.net/roXon/TnG4E/4/! –

+0

@roXon: to głównie nie działa z powodu mojej literówki w UNDBIND (problem z mówieniem po niemiecku;)). To tylko przykład. Mam świadomość, że to nie zadziała w każdej sytuacji :) Ale jeśli pomyślisz, że to wystarczy do jego przykładu. – meo