2011-08-12 20 views
22

Estuve algunas pruebas reserching para este other question, cuando me di cuenta de algo muy peculiar. FF4/5 no activa el evento jQuery focus. The other question, que podría considerarse un duplicado, se cerró y aceptó sin una respuesta real.jQuery Focus falla en Firefox

Para la pregunta misma, probé el siguiente segmento de código simple:

$('#target').focusout(function() { 
    $(this).focus(); 
}); 

Funciona bien en Chrome y en IE, pero falla en FF. Aquí está el jsFiddle para los perezosos entre nosotros.

¿Alguien puede explicar este comportamiento? ¿O es un error conocido?

+1

estaría muy interesado en cualquiera arrojar luz sobre esto. Saludos por la publicación. – Somk

Respuesta

46

creo que me encontré con esto antes, y si no recuerdo mal parecía ser algún tipo de problema de reentrada. Mi impresión fue que debido a que FF ya está en el proceso de transición de enfoque, no le permitirá iniciar otra transición de enfoque. Creo que mi solución era algo así como

$('#target').focusout(function() { 
    setTimeout(function() { 
     $(this).focus(); 
    }, 0); 
}); 
+0

Esta es la solución que me dieron y funcionó perfectamente. – Somk

+4

+1 porque 'focus()' funciona en Firefox.Es solo cuando está contenido dentro de este 'focusout()' que parece estar causando el problema. – tw16

+0

En realidad, setTimeout (func, 0) debería ser suficiente, ya que la función se saca del contexto del subproceso que se ejecuta y se ejecuta inmediatamente después. 100 ms podría causar un parpadeo :) –

3

El manual dice aboult .focus() llamada

Este método es un método abreviado para .trigger ('enfoque')

y del tema .trigger()

Aunque .trigger() simul requiere una activación de evento, completa con un objeto de evento sintetizado, no replica perfectamente un evento natural.

Así como yo lo entiendo, la llamada $(this).focus(); se supone que activar el evento OnFocus (si hay uno conectado al objeto), pero no se quaranteed a la creación efectiva/cambiar el objeto enfocado.

+1

Sin embargo, el hecho permanece en solo falla en Firefox. –

+1

Sí, pero no es un error, ya que es una especie de limitación documentada (pensamiento no muy claro). – ain

0

Esto funcionó para mí en Firefox 38. Necesitaba probar diferentes ms de retardo. Gracias a @camaleo comment.

$(document).ready(function() { 
setTimeout(function() { $('#myid').focus(); }, 100); 
}); 
0

El foco parece funcionar ahora en el último Firefox sin la necesidad de la función setTimeout.

Si desea seleccionar también el campo de entrada que tendrá que hacer uso de la función .select(), aunque como Document.ExecCommand ('Seleccionar Todo'); tampoco parece funcionar en Firefox.

Así que una vez el campo de entrada se centraron primero y luego se seleccionaron a continuación, puede copiarlo o hacer lo que quiera con él.

En mi caso de uso que requiere copiar la URL del campo de entrada si alguien pulsa sobre el botón de copia:

$(".copyURL").click(function(){ 
    $(this).prev().focus().select(); 
    document.execCommand("Copy",false,null); 
}); 

espero que esto podría ayudar a cualquier otra persona que está en busca de este problema!

+0

Acabo de descargar la última versión de Firefox (v50.1) y encontré que no corrigió el problema. Tal vez la versión de Linux no tiene el error corregido? Mientras tanto, muchas gracias a @chaos por el truco focusout y setTimeout (usando 0 ms). Eso solucionó el problema. – tgoneil