Pregunta

¿Es posible cambiar la posición del avatar con la dnd api de dojo toolkit? En este momento, al arrastrar, el avatar del elemento arrastrado aparece a la derecha y debajo del cursor del mouse. Quiero que esté en la misma posición que el cursor del mouse. Ejecuté algunas pruebas de usabilidad en mi aplicación, y la mayoría de las personas parecen intentar intentar arrastrar el avatar al área de colocación, en lugar de mover el cursor sobre el área de colocación. Cualquier entrada sería buena. Gracias!

¿Fue útil?

Solución

Lo sentimos, no es posible por razones técnicas.

ACTUALIZACIÓN: por demandas populares, estas son razones técnicas:

  • Cuando tiene un nodo justo debajo del mouse, el nodo obtiene todos los eventos del mouse.
  • Los eventos del mouse suben por la cadena principal.
  • Ahora imagine que mueve este nodo con el mouse & # 8212; este nodo siempre obtendría todos los eventos del mouse.
  • Significa que cualquier otro nodo, por ejemplo, un objetivo no puede obtener eventos del mouse a menos que sea un padre del nodo movido. Por lo general, este no es el caso.

¡Pero sé que otras personas pueden hacerlo! ¡Debería ser posible! Sí, es posible & # 8230; en principio:

  • Registremos todos los nodos de destino.
  • Capturemos los eventos relevantes de movimiento del mouse directamente en el padre superior (el documento).
  • Cuando detectamos una operación de arrastre, hagamos lo siguiente:
    1. Calcular la geometría (cuadros delimitadores) de todos los objetivos.
    2. En cada movimiento del mouse, verifiquemos si la posición actual del mouse se superpone con un objetivo. Puntos de bonificación para un " A + " estudiante: detecta superposiciones con otros nodos, por ejemplo, cuando un objetivo está parcialmente oculto por razones estéticas, y procesa esta situación correctamente.
    3. Si la posición actual del mouse se superpone con un objetivo, iniciemos " drop es posible " acciones, por ejemplo, muestran algunas señales para que el usuario final sepa que puede soltar ahora.

¿Por qué Dojo no hace eso? Por varias razones técnicas (¡finalmente llegamos allí!):

  • Los cálculos de geometría de un nodo son notoriamente defectuosos en la mayoría de los navegadores. Tan pronto como las tablas estén involucradas, o cualquier otro medio de colocación no trivial, no puede estar 100% seguro de que el cuadro delimitador sea correcto.
  • Los cálculos de geometría son una operación costosa, y tenemos que hacerlo al menos una vez en cada operación de arrastre para todos los objetivos, suponiendo que no se puedan realizar cambios durante la operación de arrastre (no siempre es el caso). Un navegador puede refluir nodos por muchas razones & # 8658; puede mover / cambiar el tamaño de los objetivos existentes, por lo que debemos estar atentos.
  • Normalmente, los cuadros calculados se mantienen en una lista & # 8658; verificar la lista de intersecciones es O (n) (lineal) & # 8658; no escala bien a medida que crece el número de objetivos.
  • Todos los controladores de eventos de mouse deben ser rápidos, de lo contrario, la función de manejo de eventos de mouse de un navegador puede estar "rota". que conduce a efectos secundarios impredecibles. Consulte los puntos anteriores para conocer los motivos por los que el procesamiento de eventos del mouse puede ser lento.
  • Es posible mejorar la búsqueda lineal, por ejemplo, se pueden usar árboles espaciales 2D, pero esto conduce a más (mucho más) código JavaScript & # 8658; más cosas para descargar en el lado del cliente & # 8658; normalmente no vale la pena.

¿Cómo sé eso? Debido a que Dojo solía tener este tipo de arrastrar y soltar en versiones anteriores, y nos enfermamos y nos cansamos de los problemas de combate que describí anteriormente. Cualquier mejora fue una batalla cuesta arriba, que aumentó el tamaño del código. Finalmente, decidimos no reinventar y replicar mecanismos ya integrados en un navegador. Un navegador hace prácticamente el mismo trabajo: calcula la geometría de los nodos, encuentra el nodo subyacente y distribuye un evento de movimiento del mouse de manera adecuada.

La implementación actual no usa eventos de movimiento del mouse y no calcula la geometría. En su lugar, se basa en eventos de activación / desactivación del mouse detectados por los objetivos después de iniciar un arrastre. Funciona de manera confiable y escala bien.

Otra arruga en esta historia: Dojo trata los objetivos como contenedores & # 8212; un caso de uso muy común (carritos de compras, reorganización de artículos, jerarquías de edición). En este momento se implementan contenedores lineales y árboles genéricos, son posibles contenedores personalizados. Al arrastrar y soltar, puede ver y soltar elementos arrastrados en una posición adecuada dentro de un contenedor de destino, por ejemplo, insertándolos entre elementos existentes. Implementar esta función utilizando cálculos geométricos y verificaciones sería prohibitivamente costoso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top