Domanda interessante. Il nocciolo della questione è - quando scocca l'evento "focus", prima o dopo l'evento di sfocatura? Se si attiva prima dell'evento di sfocatura, il problema è semplice, perché è possibile archiviare lo stato attivo in una variabile a cui può accedere l'evento sfocatura.
Tuttavia, almeno in Chrome 13, sembra che l'evento sfocatura si verifichi prima dell'evento di messa a fuoco. Una possibile soluzione.
Dato il seguente codice HTML:
<input id="foo" value='foo' />
<input id="bar" value='bar' />
È possibile:
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);
};
});
Fondamentalmente, io proprio non la richiamata sfocatura quindi è a portata di mano per l'evento di messa a fuoco di chiamare dopo che sappiamo di che elemento è stato focalizzato.
Ecco un working example su JSFiddle.
EDIT: questa soluzione soffre del problema che, se si sfocatura sul form cliccando su qualcosa altro che un altro elemento del modulo, l'evento sfocatura non si attiva mai (visto che attendere l'evento di messa a fuoco). L'unico modo che posso immaginare è l'utilizzo di un timer per controllare se PendingBlur è definito e, in tal caso, chiamarlo. A questo punto non hai più bisogno dell'evento di messa a fuoco per richiamare più il callback della sfocatura ...
Beh, è possibile farlo in jQuery, il che significa che è fattibile in Javascript. Non ho idea però, bella domanda. +1 –
Hmmm. Puoi pubblicare jQuery in una risposta e forse posso lavorare a ritroso? –
possibile duplicato di [Quando si verifica onblur, come posso scoprire quale elemento è stato attivato da fuoco * a *?] (Http://stackoverflow.com/questions/121499/when-onblur-occurs-how-can-i-find- out-which-element-focus-went-to) –