Question

Est-il possible de changer le positionnement de l'avatar avec le dnd api de dojo toolkit? Au moment où vous faites glisser, l'avatar de l'élément déplacé apparaît à droite et sous le curseur de la souris. Je veux qu'il soit dans la même position que le curseur de la souris. J'ai effectué des tests d'utilisabilité sur mon application, et la plupart des gens semblent essayer de faire glisser l'avatar dans la zone de dépôt, au lieu de déplacer le curseur sur la zone de dépôt. Toute entrée serait sympa. Merci!

Était-ce utile?

La solution

Désolé, impossible pour des raisons techniques.

MISE À JOUR: à la demande générale, ce sont des raisons techniques:

  • Lorsque vous avez un nœud sous la souris, il reçoit tous les événements de la souris.
  • Les événements de la souris remontent dans la chaîne parente.
  • Maintenant, imaginez que vous déplacez ce nœud avec la souris - ce nœud obtiendra toujours tous les événements de la souris.
  • Cela signifie que tout autre nœud, par exemple une cible, ne peut obtenir les événements de la souris que s'il s'agit d'un parent du nœud déplacé. Ce n'est généralement pas le cas.

Mais je sais que d’autres personnes peuvent le faire! Cela devrait être possible! Oui, c'est possible… en principe:

  • Enregistrons tous les nœuds cibles.
  • Attrapons les événements de déplacement de la souris pertinents directement sur le parent le plus élevé (le document).
  • Lorsque nous détectons une opération de glisser, procédons comme suit:
    1. Calculez la géométrie (cadres de sélection) de toutes les cibles.
    2. A chaque déplacement de la souris, vérifions si la position actuelle de la souris chevauche une cible. Points bonus pour un " A + " étudiant: détecte les chevauchements avec d'autres nœuds, par exemple lorsqu'une cible est partiellement obscure pour des raisons esthétiques, et traite cette situation correctement.
    3. Si la position actuelle de la souris chevauche une cible, initions-nous. "il est possible de lâcher", Les actions, par exemple, montrent des signaux pour que l’utilisateur final sache qu’il peut maintenant abandonner.

Pourquoi Dojo ne fait pas ça? Pour un certain nombre de raisons techniques (nous y sommes finalement arrivés!):

  • Les calculs de géométrie d'un nœud sont notoirement anormaux dans la plupart des navigateurs. Dès que des tables sont impliquées, ou tout autre moyen de placement non trivial, vous ne pouvez pas être sûr à 100% que le cadre de sélection est correct.
  • Les calculs de géométrie sont une opération coûteuse et nous devons le faire au moins une fois pour chaque opération de glisser pour toutes les cibles, en supposant qu'aucune modification ne peut être apportée pendant l'opération de glisser (pas toujours le cas). Un navigateur peut rediffuser des nœuds pour de nombreuses raisons ? il peut déplacer / redimensionner des cibles existantes, nous devons donc être vigilants.
  • En règle générale, les boîtes calculées sont conservées dans une liste ? si la liste des intersections n'est pas cochée O (n) (linéaire) ? ne s'adapte pas correctement à mesure que le nombre de cibles augmente.
  • Tous les gestionnaires d'événements de souris doivent être rapides, sinon la fonction de gestion des événements de souris d'un navigateur peut être "endommagée". conduisant à des effets secondaires imprévisibles. Voir les points précédents pour les raisons pour lesquelles le traitement des événements de souris peut être lent.
  • Il est possible d'améliorer la recherche linéaire. Par exemple, vous pouvez utiliser des arbres spatiaux 2D, mais cela conduit à plus (beaucoup plus) de code JavaScript ? plus de choses à télécharger côté client ? généralement cela n'en vaut pas la peine.

Comment je sais ça? Parce que Dojo possédait ce genre de drag'n'drop dans les versions précédentes, nous avons eu des problèmes de combat malades et fatigués que je décris plus haut. Toute amélioration était une bataille difficile, qui augmentait la taille du code. Enfin, nous avons décidé de ne pas réinventer ni reproduire les mécanismes déjà intégrés dans un navigateur. Un navigateur effectue pratiquement le même travail: calcule la géométrie des nœuds, trouve le nœud sous-jacent et distribue un événement de déplacement de la souris de manière appropriée.

L'implémentation actuelle n'utilise pas les événements de déplacement de la souris et ne calcule pas la géométrie. Au lieu de cela, il se base sur les événements survolés / non détectés par les cibles après le début du glissement. Cela fonctionne de manière fiable et évolue bien.

Autre particularité de cette histoire: Dojo considère les cibles comme des conteneurs - un cas d’utilisation très courant (caddies, réorganisation des éléments, modification des hiérarchies). Des conteneurs linéaires et des arbres génériques sont mis en œuvre à l'heure actuelle, des conteneurs personnalisés sont possibles. Lorsque vous faites glisser et déposez, vous pouvez voir et déposer les éléments glissés à une position appropriée dans un conteneur cible, par exemple, en les insérant entre des éléments existants. L'implémentation de cette fonctionnalité à l'aide de calculs et de vérifications géométriques aurait un coût prohibitif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top