2010-05-07 22 views
11

Actualmente estoy desarrollando una aplicación web y me he encontrado con un pequeño problema. Estoy usando ExtJS, pero creo que esta es una pregunta general de JS.Garantizando el evento onmouseout para disparar

Cuando el cursor entra en un elemento HTML, el evento onmouseover se activa, cuando el cursor deja ese elemento, se activa onmouseout. Hasta aquí todo bien. Lamentablemente, parece que uno no puede confiar plenamente en este comportamiento. Los movimientos muy rápidos del mouse pueden provocar que el evento no se dispare (como lo hace el reposicionamiento del cursor con una pen tablet, por ejemplo).

¿Cuáles son las mejores prácticas para manejar estos problemas? ¿Debo controlar todos los eventos onmousemove y controlar manualmente dónde estaba el cursor por última vez y disparar el evento onmouseout apropiado?

Respuesta

3

Este es un problema común, y no es trivial para resolver. Es básicamente imposible de resolver tratando de manejar mouseover/out en el nivel de elemento individual. Con Ext JS, generalmente es recomendable usar el manejo delegado de eventos cuando sea posible, lo que también puede ayudar a monitorear eventos de mouse. Por ejemplo, monitoree el mouseover/out al nivel más alto posible, y verifique el objetivo del evento y/o el objetivo relacionado (propiedades del objeto del evento pasado a su función de manejo) para descubrir qué elementos están involucrados durante un evento dado (lo he hecho esto mismo - puede ser complicado, pero es efectivo). Si su caso de uso está monitoreando escenarios de arrastrar/soltar válidos, las clases DragZone y DropZone fueron diseñadas para hacer esto.

Si puede completar algunos detalles más sobre lo que intenta lograr, podría ser útil.

+0

Lo resolví sobrescribiendo Ext.dd.DropZone.notifyOver y activando manualmente los eventos de mouse si se perdieron. Parece que funciona de manera confiable hasta el momento. – n3rd

3

He tenido un problema similar anteriormente y he usado this technique. Es posible que esto no ayude en las situaciones en las que se cambia el cursor de una tableta digitalizadora, no tengo una para verificar que sí, pero puede suponer que se trata de una anomalía si se dirige a usuarios normales de la web. Avíseme si funciona, de lo contrario, veré si puedo ayudar más.

Martyn

+0

Hm, artículo interesante. Aunque no veo cómo esto está relacionado con mi pregunta. Después de todo, estoy recibiendo "muy pocos" eventos, no demasiados. – n3rd

+1

Ah sí, disculpa por eso, respondiste esa pregunta antes de tomar un café esta mañana. No hay una forma absoluta de garantizar que los eventos se dispararán a menos que usted haga lo propio. Como Konerak menciona, agregue un oyente a la página y verifique el elemento contra el que se dispara. Insertaría el elemento actual en el método onmouseover y lo abriría en el onmouseout, necesitarás escribir algo de lógica para ver si algo no funciona bien. No es elegante, pero debería funcionar. De nuevo, disculpe mi confusión – Martyn

Cuestiones relacionadas