2012-07-18 19 views
32

Załóżmy zrobić to:Get kliknięciu obiektu, który wywołał jquery blur() zdarzenie

$(target).blur(function(e){ 
    //do stuff 
}); 

Czy istnieje sposób, aby pobrać obiekt, który został kliknięty na w celu wywołania działania rozmycia?

Próbowałem użyć e.target, ale wydaje się, że zwraca obiekt dołączony do akcji rozmycia, a nie kliknięty obiekt.

+2

Dlaczego to pytanie oznaczone jako duplikat? Nie znalazłem jeszcze innego pytania na temat zdarzenia rozmycia jQuery. Jeśli to naprawdę jest dupe, połącz się z duplikatem pytania. –

+0

Czy ktoś znalazł sposób na sprawdzenie, czy przeglądarki inne niż Chromium działają w tej sytuacji? Tabulatory poza polem nie mogą być obsługiwane, aby uzyskać nowy skupiony element, o ile mogę powiedzieć. 'var target = e.toElement || e.relatedTarget; 'nic nie zwraca. Crappy specs from crappy spec writers ... – user2173353

Odpowiedz

29

Jeśli dobrze rozumiem pytanie, należy to zrobić:

$(function() { 

    var clicky; 

    $(document).mousedown(function(e) { 
     // The latest element clicked 
     clicky = $(e.target); 
    }); 

    // when 'clicky == null' on blur, we know it was not caused by a click 
    // but maybe by pressing the tab key 
    $(document).mouseup(function(e) { 
     clicky = null; 
    }); 

    $(target).blur(function(e) { 
     console.log(clicky); 
    });​​ 

}); 
+6

Działa to tylko wtedy, gdy użytkownik * kliknął * na innym elemencie. Nie działa, gdy użytkownik go otworzył lub uzyskał fokus za pomocą innej metody. –

1

Używanie tego w ramach funkcji obsługi blur daje element blured.

$(target).blur(function(e){ 
    var bluredElement = this; // dom element 
    // To make a jQuery object 
    var bluredElement = $(this); 
}); 

W przypadku zdarzenia blur nie można przechwycić klikniętego elementu. Aby uzyskać element ed click potrzebujesz zdarzenia click. Na przykład:

$(element).click(function() { 
    var clickedElement = this; 
}); 

i uzyskać element skupiony można użyć :focus selektor jak: $(':focus') będzie koncentrować powraca elementu w dokumencie.

+0

Stwierdziłem, że muszę wstawić '$ someElement.is (': focus')' lub '$ (': focus')' wewnątrz funkcji 'setTimeout', wywołanej rozmyciem handler, aby dać przeglądarkom szansę skupienia się na następnym elemencie. –

9

Wewnątrz obsługi zdarzeń this będzie element zdarzenie jest związana, a e.target będzie elementem wyzwalane zdarzenie (może być lub nie być taka sama, jak this).

Podajesz wydarzenie blur, a nie click. Tak więc, w twoim wydarzeniu, będziesz mieć element, który byłeś blur ed. Jeśli potrzebujesz elementu ed click, potrzebujesz innego zdarzenia, aby to uzyskać.

blur może być wyzwalany przez inne zdarzenia, takie jak ustawianie ostrości; nie tylko kliknięcie na coś. Tak więc nie ma sposobu, aby uzyskać element, który "spowodował rozmycie".

+0

To nieprawda, że ​​nie ma mowy. Odwołaj się do tej odpowiedzi: http://stackoverflow.com/a/11544589/1450294 –

38

Sztuką jest, aby odczekać dodatkowy haczyk:

$(el).blur(function (event) { 
    // If we just hangout an extra tick, we'll find out which element got focus really 
    setTimeout(function(){ 
     document.activeElement; // This is the element that has focus 
    },1); 
}) 
+1

Zauważyłem, że 'setTimeout' wymagało wyraźnego opóźnienia, aby zezwolić na inne zdarzenie' click'; również dla mnie (jQuery 1.8) 'document.activeElement' było' body', co nie było zbyt pomocne :) – drzaus

+0

Działa to dobrze w chrome 30 i Firefox 19. –

+0

działa to w IE9 + i innych dobrych przeglądarkach? – chovy