Вопрос

Можно ли изменить расположение аватара с помощью dnd api dojo toolkit?В данный момент при перетаскивании аватар перетаскиваемого элемента появляется справа и под курсором мыши.Я хочу, чтобы он находился в том же положении, что и курсор мыши.Я провел несколько тестов юзабилити в своем приложении, и большинство людей, похоже, пытаются перетащить аватар в область перетаскивания, в отличие от наведения курсора на область перетаскивания.Любой вклад был бы приятен.Спасибо!

Это было полезно?

Решение

К сожалению, это невозможно по техническим причинам.

Обновить:по многочисленным просьбам, это технические причины:

  • Когда у вас есть узел прямо под мышкой, узел получает все события мыши.
  • События мыши всплывают вверх по родительской цепочке.
  • Теперь представьте, что вы перемещаете этот узел с помощью мыши — этот узел всегда будет получать все события мыши.
  • Это означает, что любой другой узел, например, целевой, не может получать события мыши, если только он не является родительским для перемещенного узла.Как правило, это не так.

Но я знаю, что другие люди могут это сделать!Это должно быть возможно!Да, это возможно... в принципе:

  • Давайте зарегистрируем все целевые узлы.
  • Давайте отловим соответствующие события перемещения мыши непосредственно на самом верхнем родительском элементе (документе).
  • Когда мы обнаружим операцию перетаскивания, давайте сделаем следующее:
    1. Вычислите геометрию (ограничивающие прямоугольники) всех целей.
    2. При каждом перемещении мыши давайте проверять, совпадает ли текущее положение мыши с целью.Бонусные баллы для студента с оценкой "А+":обнаружьте совпадения с другими узлами, например, когда цель частично скрыта по косметическим причинам, и обработайте эту ситуацию правильно.
    3. Если текущее положение мыши совпадает с целью, давайте инициируем действия "удаление возможно", например, покажем несколько подсказок, чтобы конечный пользователь знал, что теперь он может выполнить удаление.

Почему Додзе этого не делает?По ряду технических причин (наконец-то мы добрались туда!):

  • Общеизвестно, что вычисления геометрии узла приводят к сбоям в большинстве браузеров.Как только задействованы таблицы или любые другие нетривиальные средства размещения, вы не можете быть на 100% уверены в правильности ограничивающей рамки.
  • Геометрические вычисления - дорогостоящая операция, и мы должны выполнять ее по крайней мере один раз при каждой операции перетаскивания для всех целевых объектов, предполагая, что во время операции перетаскивания нельзя внести никаких изменений (не всегда это так).Браузер может перепрофилировать узлы по многим причинам ⇒ он может перемещать / изменять размер существующих целевых объектов, поэтому мы должны быть бдительны.
  • Обычно вычисляемые поля хранятся в виде списка ⇒ проверка списка на наличие пересечений является O (n) (линейной) ⇒ масштабируется плохо по мере роста числа целей.
  • Все обработчики событий мыши должны быть быстрыми, в противном случае средство обработки событий мыши в браузере может быть "сломано", что приведет к непредсказуемым побочным эффектам.Причины, по которым обработка событий мыши может быть медленной, приведены в предыдущих пунктах.
  • Возможно улучшение линейного поиска, например, можно использовать 2D пространственные деревья, но это приводит к большему (намного большему) количеству кода JavaScript ⇒ больше материала для загрузки на стороне клиента ⇒ обычно оно того не стоит.

Откуда мне это знать?Потому что в более ранних версиях Dojo раньше был такой drag-n'drop, и мы устали бороться с проблемами, которые я описал выше.Любое улучшение было тяжелой битвой, которая увеличивала размер кода.В конце концов мы решили не изобретать заново и не тиражировать механизмы, уже встроенные в браузер.Браузер выполняет практически ту же работу:вычисляет геометрию узлов, находит базовый узел и соответствующим образом отправляет событие перемещения мыши.

Текущая реализация не использует события перемещения мыши и не вычисляет геометрию.Вместо этого он полагается на события наведения / выхода курсора мыши, обнаруженные целевыми объектами после запуска перетаскивания.Он работает надежно и хорошо масштабируется.

Еще одна загвоздка в этой истории:Dojo рассматривает целевые объекты как контейнеры — очень распространенный вариант использования (корзины покупок, перестановка товаров, редактирование иерархий).На данный момент реализованы линейные контейнеры и универсальные деревья, возможны пользовательские контейнеры.При перетаскивании вы можете увидеть и поместить перетаскиваемые элементы в нужное положение внутри целевого контейнера, например, вставив их между существующими элементами.Реализация этой функции с использованием геометрических вычислений и проверок была бы непомерно дорогостоящей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top