Si se hace clic en un elemento, los mousedown
desencadena el evento antes de foco. Solo necesita establecer un atributo de datos y verificarlo en el evento de enfoque.
Prueba esta demo: http://jsfiddle.net/KcGcF/1/
$('a').mousedown(function(e){
var $this = $(this);
// Only set the data attribute if it's not already focused, as the
// focus event wouldn't fire afterwards, leaving the flag set.
if(!$this.is(':focus')){
$this.data('mdown',true);
}
});
$('a').focus(function(e){
var $this = $(this);
var mdown = $this.data('mdown');
// Remove the flag so we don't have it set next time if the user
// uses the tab key to come back.
$this.removeData('mdown');
// Check if the mousedown event fired before the focus
if(mdown){
// Click
} else {
// Tab
}
});
no tengo una respuesta concreta, pero una forma podría ser utilizar la pulsación de tecla '()' evento para almacenar el tiempo la tecla Tab última pulsación, y si fue hace muy poco tiempo, puede estar bastante seguro de que es una tabulación. Además, para detectar un clic, ligue al evento click. No estoy seguro de cuál se ejecuta primero, pero tal vez establecer un elemento de datos en el elemento en el controlador de clics y buscar ese elemento de datos en el controlador de enfoque sería otro camino por recorrer. – GregL
El evento 'focus' siempre se dispara antes del' click', pero 'mousedown' se dispara antes de' focus'. – DarthJDG