2013-08-21 18 views
13

Problem polegał na tym, że potrzebuję "onClickOut" -Event.onClickOut (kliknij po opuszczeniu elementu)

Na przykład: Masz widok DIV na zawisanie (onMouseOver) niektóre przyciski lub co kiedykolwiek.

Jeśli klikniesz na zewnątrz elementu, musisz go ukryć, ale jeśli powiesz $ ("body"), kliknij, a także zostanie ukryty po kliknięciu w sam element. :/

Teraz słucham myszy i kiedy mouseleave() Ustawiam var na kliknięciu w mój element. W następnym kroku odsłuchuję generelly click-event (body), ale pytam, czy var został ustawiony. Jeśli nie, musi to być kliknięcie poza moim elementem, więc mogę ukryć swój element.

Mam nadzieję, że można go używać:

$("#schnellsuche_box").mouseleave(function() { 
    var inside; 
    $("#schnellsuche_box").click(function() { 
     inside = true; 
    }); 
    $("body").click(function() { 
     if(!inside) { 
      $("#schnellsuche_box").hide(); 
     } 
    }); 
    delete inside; 
}); 
+0

Uwaga: nie można "usunąć" zmiennej lokalnej. (Ale nawet gdybyś mógł, nie miałoby to sensu, ponieważ twoje programy do obsługi kliknięć próbują użyć tej zmiennej.) – nnnnnn

Odpowiedz

3

to zrobić poprzez słuchanie kliknięcie na poziomie dokumentu, a wewnątrz obsługi zdarzeń sprawdzić, czy element kliknięty był #schnellsuche_box lub dowolny element wewnątrz #schnellsuche_box za pomocą closest(), tak:

$(document).on('click', function(e) { 
    if (! $(e.target).closest('#schnellsuche_box').length) 
     $('#schnellsuche_box').hide(); 
}); 

FIDDLE

1

Trzeba zatrzymać zdarzenie #schnellsuche_box click z pęcherzyków do zdarzenia click body (to domyślna propagacja zdarzenia) wykonując return false:

$("#schnellsuche_box").click(function() { 
    inside = true; 

    return false; 
}); 
+1

'event.stopPropogation();' też będzie działało, powiedziano mi, że 'return false' przestaje tylko bąblować kiedy jest używany w wywołaniach jquery – rps

+0

@rps Tak, to zadziała, ale to nie dotyczy wyłącznie jQuery, działa też w JavaScript. – mattytommo

+1

Nie jestem pewien, do czego "to" odnosi się w twoim komentarzu * "działa również w JavaScript" *, ale jeśli jest to 'return false;', to zapobiegnie tylko domyślnemu zdarzeniu w "nie-jQuery" "programy obsługi zdarzeń, a nie propagacja zdarzeń. –

0

Wypróbuj:

$("body").click(function(e) { 
    var $target = $(e.target); 
    if (!$target.is('#schnellsuche_box') && 
     !$target.parents('#schnellsuche_box').length) { 
     alert('outside'); 
    } 
}); 
0
$("#schnellsuche_box").on("click",function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
}); 
+0

@ F4r-20 Nie musisz, "zdarzenie" odnosi się do bieżącego zdarzenia JavaScript. – mattytommo

+0

Nie wiedziałem, dzięki. – George

+0

@mattytommo - przynajmniej tak, jeśli używasz IE i niektórych wersji Chrome. Należy go zdefiniować jako parametr. – adeneo

Powiązane problemy