2009-08-03 2 views
4

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

+0

Для будущих искателей: я наткнулся на эту проблему, пытаясь изменить значения dojo.dnd.Manager OFFSET_X и OFFSET_Y, которые нарушили мой целевой показатель. –

ответ

6

Извините, по техническим причинам не представляется возможным.

UPDATE: популярные требования эти технические причины:

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

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

  • Зарегистрироватся все целевые узлы.
  • Давайте поймать соответствующие события перемещения мыши непосредственно на верхнем родителе (документе).
  • Когда мы обнаружим операцию перетаскивания, давайте сделаем следующее:
    1. Расчет геометрии (ограничивающей коробки) всех целей.
    2. На каждом перемещении мыши можно проверить, совпадает ли текущая позиция мыши с целью. Бонусные очки для ученика «A +»: обнаружение совпадений с другими узлами, например, когда цель частично скрыта по косметическим причинам и правильно обрабатывает эту ситуацию.
    3. Если текущая позиция мыши перекрывается с целью, давайте начнем действия «drop is possible», например, покажем некоторые подсказки, чтобы конечный пользователь знал, что она может сейчас уйти.

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

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

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

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

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

+0

Какие технические причины? Любая документация, на которую вы могли бы направлять меня? – Calvin

+0

Верьте или нет, но так начинается официальная документация - объясняя основные причины. Я на 100% уверен, что вы его прочитали, но на всякий случай это ссылка: http://docs.dojocampus.org/dojo/dnd –

Смежные вопросы