2013-03-12 14 views
8

Mam div, który tworzę dynamicznie poprzez jQuery z kilkoma linkami/przyciskami w nim. Kiedy ten div traci ostrość, muszę go usunąć. W tej części mogę zrobić dobrze.jQuery focusout dla całego div i dzieci

Jednak teraz mam zdarzenie focusout na opakowaniu dla div i kiedy kliknę przycisk wewnątrz div, wrapper traci skupienie do dziecka i moje wydarzenie zostaje odpalone. Sprawdzanie, czy element został kliknięty, jest dzieckiem opakowania, które mogę zrobić, ale ponieważ opakowanie nie jest już skupione, moje zdarzenie nie zostanie ponownie uruchomione, aby usunąć element div.

Próbowałem również .blur, ale to nie działa lepiej.

Jaki jest najlepszy sposób na zrobienie tego?

+0

Podaj skrzypce . – honk31

+2

Proszę napisać swój kod, a następnie * opcjonalnie * dostarczyć skrzypce. –

Odpowiedz

12
$("#yourDiv").focusout(function() { 
    if ($(this).has(document.activeElement).length == 0) { 
     // remove div 
    } 
}); 

$(this) = div, z którego się skupiasz.

document.activeElement = element, który jest aktualnie ostry.

$(this).has(document.activeElement) jest po prostu sprawdzenie, czy aktywnym elementem jest dzieckiem swojej div

+0

Dzięki, działa idealnie :) Inny link odpowiedzi jest zepsuty, nie można sprawdzić. –

+0

To rozwiązało, jeśli dla mnie również. Dziękuję Ci! – rusvdw

+7

Nie działa dla mnie, ponieważ w tym momencie nowy element nie otrzymał jeszcze ostrości, więc activeElement jest ciałem. – Bill

1

Sposobem rozwiązania tego zwykły JavaScript jest za pomocą relatedTarget podaną w argumencie zdarzenia:

element.addEventListener('focusout', function(event) { 
    if (element.contains(event.relatedTarget)) { 
     // don't react to this 
     return; 
    } 
    // do something 
}); 
Powiązane problemy