2011-08-17 11 views
14

Zostało to wcześniej zadane here, ale kilka lat temu i nie było wtedy rozwiązania wieloplatformowego (inne niż rozwiązanie setTimeout, które jest naprawdę niezbyt przydatne).Jak ustalić, gdzie nastąpiło skupienie?

Chciałbym zrobić onblur="foo(parm);" i mieć foo być w stanie określić, który element ma teraz fokus.

Używam zwykłego javascript; nie jQuery dla tego, proszę.

Czy to możliwe w dzisiejszych czasach?

+0

Jest to możliwe do wykonania w jQuery, co oznacza, że ​​jest to możliwe w JavaScript. Nie mam jednak pojęcia, dobre pytanie. +1 –

+0

Hmmm. Czy możesz umieścić jQuery w odpowiedzi i czy mogę od niej odejść? –

+0

możliwy duplikat [Kiedy pojawia się onblur, jak mogę się dowiedzieć, który element fokusu przeszedł na *?] (Http://stackoverflow.com/questions/121499/when-onblur-occurs-how-can-i-find- out-który-element-focus-went-to) –

Odpowiedz

7

Można spróbować czegoś takiego:

function whereDidYouGo() { 
    var all = document.getElementsByTagName('*'); 

     for (var i = 0; i < all.length; i++) 
      if (all[i] === all[i].ownerDocument.activeElement) 
       return all[i]; 
} 

EDIT:

function whereDidYouGo() { return document.activeElement; } 
+2

Hmmm. Ciekawy. Robię trochę czytania na temat 'activeElement'. Czy po prostu nie byłbym w stanie wykonać 'elementWithFocus = document.activeElement;'? –

+1

@ JonathanM: lol, tak, właśnie wziąłem jQuery's ': focus' filter – qwertymk

+0

Tak, tak myślę. Wydaje się, że to pokazuje: http://help.dottoro.com/external/examples/ljmiswgp/activeElement_1.htm –

3

w jQuery, na wniosek OP:

$(':input').blur(function() { 
    $focusedElement = $(':input:focus'); 
    //Do stuff with $focusedElement 
} 
+1

powiedział nie jquery. –

+0

Dzięki, Rikudo. To jest punkt wyjścia. Ktoś ma pomysły, jak przekazać to do zwykłego javascript? –

+2

@Daniel: W komentarzach poprosiłem o to jako punkt wyjścia. To jest fajne. –

2

ciekawe pytanie. Najważniejsze w tej sprawie jest - kiedy ma miejsce zdarzenie "fokus", przed lub po zdarzeniu? Jeśli uruchomi się przed zdarzeniem, problem jest prosty, ponieważ możesz zapisać bieżący fokus w zmiennej, do której zdarzenie blur może uzyskać dostęp.

Jednak, przynajmniej w przeglądarce Chrome 13, zdarzenie blur pojawia się przed zdarzenia fokusa. Jedno możliwe rozwiązanie.

Biorąc pod uwagę następujące HTML:

<input id="foo" value='foo' /> 
<input id="bar" value='bar' /> 

Następnie można:

var currentFocus; 
var pendingBlur; 

var foo = document.getElementById('foo'); 
foo.addEventListener('focus', function(){ 
    currentFocus = foo; 
    if(pendingBlur !== undefined){ 
     pendingBlur(); 
     pendingBlur = undefined; 
    } 
}); 
foo.addEventListener('blur', function(){ 
    pendingBlur = function(){ 
     console.log('new focus:', currentFocus); 
    }; 
}); 

var bar= document.getElementById('bar'); 
bar.addEventListener('focus', function(){ 
    currentFocus = bar; 
    if(pendingBlur !== undefined){ 
     pendingBlur(); 
     pendingBlur = undefined; 
    } 
}); 
bar.addEventListener('blur', function(){ 
    pendingBlur = function(){ 
     console.log('new focus:', currentFocus); 
    }; 
}); 

Zasadniczo, po prostu nie jest zwrotna rozmycie więc jest przydatny dla zdarzenia ostrości zadzwonić po wiemy o których element był skupiony.

Oto working example na JSFiddle.

EDIT: To rozwiązanie cierpi na problem, że jeśli plama na formularzu, klikając na coś inne niż innego elementu formularza, zdarzenie plama nie odpala (ponieważ czekamy na imprezy focus). Jedynym sposobem, który mogę sobie wyobrazić, jest użycie licznika czasu, aby sprawdzić, czy jest zdefiniowany element oczekującyBlur, a jeśli tak, to zadzwoń. W tym momencie naprawdę nie potrzebujesz zdarzenia fokusowania, aby wywołać zwrotne wywołanie rozmycia ...

+0

Dzięki, Matt. Będę musiał to przetrawić po obiedzie. :) –

+0

+1 za uwzględnienie czasu 'blur()' vs. 'focus()' i testowanie go na chrome. Jednak być może lepszym podejściem do radzenia sobie z opóźnieniem pomiędzy 'blur()' i 'focus()' może być użycie 'setTimeout()' z funkcją wywoływaną przez 'onblur'. –

+0

@ Jonathan M, tak, byłbym skłonny użyć limitu czasu. Właśnie uniknąłem tego, biorąc pod uwagę twoją prośbę na pytanie :) – Matt

Powiązane problemy