2012-03-13 17 views
5

He notado un extraño problema con la forma en que Chrome maneja el evento de javascript focus. El hecho es que activa continuamente el evento de enfoque, incluso si ocurre solo una vez. Investigué aquí y encontré preguntas en las que las personas se encuentran con el mismo problema cuando usan alert(). Cuando cierran la ventana de alerta, el foco vuelve a sus entradas y un controlador se dispara una y otra vez. En mi caso, el problema es diferente, ya que estoy usando console.log(), y de vez en cuando obtengo el mismo log 2 o incluso 3 veces. Me di cuenta de que generalmente sucede cuando borro la consola y luego me concentro en un elemento. Cuando trato de repetirlo, ya no ocurre.Google Chrome duplica el evento 'focus' de JavaScript

El escenario:

  1. consola Claro
  2. Focus sobre el elemento (2 o 3 mensajes de la consola)
  3. centrarse en otras elemento idéntico o unfocus y centrarse de nuevo en el mismo (no hay problemas)
  4. Claro consola
  5. Enfoque en el elemento (2 o 3 mensajes de la consola - el problema es posterior)

He creado un jsFiddle, por favor echa un vistazo: http://jsfiddle.net/ffuWT/3/

La pregunta es, ¿cuál es la razón de este problema y cómo puedo trabajar alrededor de ella?

+1

Funciona como esperaba (no como usted lo describe), ejecutando Chrome 17.0.963.78 m – m90

+0

No soy capaz de recrear su problema, y ​​no veo cómo borrar la consola en '# 4' haría crear un problema con los eventos disparando dos veces? ¿Has intentado evitar que el evento burbujee en tu función? Intente agregar 'e.stopPropagation()' –

+0

. Puedo recrear el problema. 'e.stopPropagation' no lo resuelve por mí. –

Respuesta

3

Pude volver a crear el problema (usando su jsFiddle) y de lo que puedo verlo solo ocurre cuando hace clic en select sin tener foco en/en el cuadro de resultados.

Haga clic en el marco pero no en el select s antes de hacer clic para expandir uno de los select sy solo verá una línea registrada.

También puede agregar /show a la URL jsFiddle para ver result in a separate window.

Parece que al enfocar la ventana haciendo clic en un control select se desencadena el evento varias veces.

Open this demo y desenfocar la ventana del navegador (haciendo clic en el escritorio, barra de tareas u otra ventana) y haga clic en uno de los select s para expandir sus option s y ver la consola.

Uso de Chrome 17.0.963.79 m.

6

Creepy cómo estas cosas pueden suceder. Hoy me he encontrado con este problema en el trabajo, pero he escrito esto rápidamente, sospechando que se escucha y propaga un evento dudoso en un complemento de terceros (jQuery customInput). Comprobaré tu Jsfiddle mañana.

No puedo volver a crear su salida exacta en mi actualmente disponible configuración (Chrome v17 en una Mac) pero tengo una teoría para compartir. En su escenario y en Ben Lee, el comentario consiste en cambiar el foco a otra ventana (consola en su caso).

Salida http://www.quirksmode.org/dom/events/blurfocus.html en "Ventana + elemento enfocable":

Si la ventana se envía hacia atrás mientras un elemento enfocable se centra, eventos desenfoque debe disparar en ambos. Si se vuelve a adelantar la ventana , los eventos de foco deben activarse en ambos.

Y a continuación, en la tabla de compatibilidad se observó que

Safari de Windows dispara dos eventos de foco.

Quizás Chrome finalmente obtuvo esta "característica" también, ¿viene de la familia de Webkit y todo?

+0

Gracias, su respuesta es correcta, y el enlace también es útil. Decidí seleccionar la respuesta de Stefan, porque me dio información precisa y correcta sobre el motivo de este problema (o solo un comportamiento diferente, si lo desea), mientras usted solo publicó su teoría. Lo cual es cierto, en realidad, así que +1, de todos modos. – noname

+0

@noname: me ahorra la necesidad de verificarlo dos veces :) –

Cuestiones relacionadas