Acción de activación jquery en foco o clic pero no ambos

Tengo este código de ejemplo:

$myTrigger .click(function(e){ alert('click'); }) .focus(function(e){ alert('focus'); $(this).click() }) 

La intención es que quiero que algo suceda al hacer clic en $ myTrigger. Si, por otro lado, se coloca en él a través del teclado (es decir, enfocado), quiero que suceda exactamente lo mismo, así que le pido que haga clic.

El problema es que si hago clic en él, también se enfoca. Así que ambas alertas se están disparando.

¿Hay alguna manera de evitar que el evento de enfoque se apague al hacer clic?

ACTUALIZAR:

El comentario de Ajm me hizo pensar que quizás estoy preguntando algo incorrecto.

Pregunta: ¿Un evento de clic siempre activa el enfoque en javascript (y / o en jQuery?). ¿Puedo suponer que cada vez que quiero manejar tanto el hacer clic con el mouse como la función de tabulación con el teclado, el evento focus () manejará ambos?

¿O depende del elemento particular al que estoy adjuntando los eventos? (En este caso, $ myObject pasa a ser una etiqueta de ancla (enlace)).

jQuery tiene una función incorporada para esto que no se usa tan a menudo llamada .one()

 $mytrigger.one('click focus', function() { alert("event"); }); 

Esto solo se activará una vez, o puede volver a enlazar si lo desea más adelante.

Para activar el clic () para el enfoque TAB (y evitar que el clic () se dispare dos veces cuando el foco proviene de un clic del mouse), hice lo siguiente:

 $('#item').mousedown(function(){ $(this).data("mouseDown", true); }); $('#item').mouseup(function(){ $(this).removeData("mouseDown"); }); $('#item').focus(function(){ if (!$(this).data("mouseDown")) $(this).click(); }); 

¿Eso funciona bien para ti?

Me encontré con un problema similar hace un tiempo. Lo resolví respondiendo al primer evento e ignorando los eventos de los próximos 20 ms.

Intenta algo como esto:

 $(document).ready(OnReady); var okToClick = true; function OnReady() { //Attach to both click and focus events $("#item").click(PerformAction).focus(PerformAction); } function PerformAction() { if (okToClick) { okToClick = false; // Do something interesting here... setTimeout(function() { okToClick = true; }, 20); } } 

Puede usar solo el método focus () y leer este artículo sobre los tipos de eventos (e) en JavaScript: http://www.quirksmode.org/js/events_properties.html

Para detectar qué evento tiene con su mouse o teclado (para probarlo), puede usar:

 if (!e) var e = window.event; alert(e.type); 

Para evitar que se llame dos veces al foco, establezca una variable para indicar si el elemento tiene foco.

 var hasFocus = false; $('#myTrigger').focusIn( function(){ hasFocus = true; //do stuff } ); $('#myTrigger').focusOut( function(){ hasFocus = false; } ); 

Enfoca toda la funcionalidad y dile a jQuery que establezca el foucus en el elemento cuando se haga clic en él si te encuentras con un navegador que no lo hace.

 $(#myTrigger).click( function(){ if(!hasFocus){$(#myTrigger).focus()}}); 

Otra opción es:

 $myTrigger .mousedown(function(e) { e.preventDefault(); // don't grab focus }) .click(function(e) { alert('click'); }) .focus(function(e) { alert('focus'); $(this).click() }); 

Esto dejará el foco del teclado donde estaba antes al hacer clic en el botón, al tiempo que permite que el botón se enfoque a través de Tab (o llamando a .focus() mediante progtwigción).