2012-07-18 8 views
32

Supponiamo faccio questo:Prendi l'oggetto cliccato che ha attivato jquery blur() evento

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

C'è un modo per andare a prendere l'oggetto che è stato cliccato al fine di attivare l'azione sfocatura?

Ho provato a utilizzare e.target, ma sembra che restituisca l'oggetto associato all'azione di sfocatura anziché l'oggetto cliccato.

+2

Perché questa domanda contrassegnato come un duplicato? Non ho trovato un'altra domanda specifica sull'evento di sfocatura di jQuery. Se è davvero un problema, si prega di collegare alla domanda duplicata. –

+0

Qualcuno ha trovato un modo per far funzionare i browser non Chromium in questa situazione? Tabulazione al di fuori del campo non può essere gestita al fine di ottenere il nuovo elemento focalizzato, per quanto posso dire. 'var target = e.toElement || e.relatedTarget; 'non restituisce nulla. Crappy specs da scrittori di crappy spec ... – user2173353

risposta

29

Se ho capito bene la tua domanda, questo dovrebbe farlo:

$(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

Questo funziona solo se l'utente * ha fatto clic su * su un altro elemento. Non funziona se l'utente lo ha inserito o ha ricevuto lo stato attivo con un altro metodo. –

1

L'utilizzo di questa funzione all'interno della funzione di gestione blur fornisce l'elemento blured.

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

All'interno dell'evento blur non è possibile rilevare l'elemento su cui si fa clic. Per ottenere l'elemento click è necessario l'evento click. Per esempio:

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

E per ottenere l'elemento focalizzato è possibile utilizzare :focus selettore del tipo: $(':focus') vi si ritorna concentrati elemento nel documento.

+0

Ho scoperto che avevo bisogno di mettere '$ someElement.is (': focus')' o '$ (': focus')' all'interno di una funzione 'setTimeout', attivata dalla sfocatura gestore, per dare ad alcuni browser la possibilità di concentrarsi sull'elemento successivo. –

9

All'interno di un gestore di eventi, this sarà l'elemento l'evento è destinato a, e e.target sarà l'elemento che ha attivato l'evento (può o non essere la stessa di this).

Si sta trasmettendo un evento blur, non un evento click. Quindi, all'interno del tuo evento, avrai l'elemento che hai blur ed. Se si desidera l'elemento click, è necessario un altro evento per ottenerlo.

blur può essere attivato da altri eventi, come la messa a fuoco di qualcosa; non solo cliccando su qualcosa. Quindi, non c'è modo di ottenere l'elemento che "ha causato la sfocatura".

+0

Non è vero che non c'è modo. Fai riferimento a questa risposta: http://stackoverflow.com/a/11544589/1450294 –

38

Il trucco è quello di aspettare un segno di spunta in più:

$(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

Ho trovato che 'setTimeout' aveva bisogno di un ritardo esplicito per consentire l'attivazione dell'evento' click'; anche per me (jQuery 1.8) 'document.activeElement' era' body', che non era molto utile :) – drzaus

+0

Funziona bene in chrome 30 e firefox 19. –

+0

funziona in IE9 + e altri buoni browser? – chovy

Problemi correlati