JQuery UI drag and drop не замечает изменений DOM, происходящих во время перетаскивания? - PullRequest
3 голосов
/ 13 апреля 2010

У меня есть HTML-таблица, в которой каждая строка (<tr>) представляет группу клиентских компьютеров. Каждая строка может быть расширена, чтобы показать клиентов, принадлежащих к группе. <tr>, содержащий клиентов, всегда генерируется, но скрывается и отображается при нажатии кнопки «плюс» в начале каждой строки.

Сами клиенты (они <div>) можно перетаскивать в другую группу, если эта группа уже расширена. Пока все отлично работает.

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

Я запрограммировал наведение, используя in и out события droppable, и это правильно расширяет группу, но (и теперь это становится трудно объяснить словами;) поведение сбрасываемого объекта (клиент) по-прежнему выглядит так, как если бы появившейся строки таблицы там не было: события in out и drop объекта сброса генерируются в старом положении элементов, а in out и drop события вновь появившегося <tr> никогда не запускаются.

Похоже, что JQuery запоминает положение, размер и т. Д. Элементов, когда начинается перетаскивание, и эти значения не обновляются, если в DOM произошли изменения до того, как произойдет падение ...

Может ли кто-нибудь подтвердить, что это нормальное поведение или оно вызвано другой проблемой в моем собственном коде? Есть обходной путь?

(вопрос уже раздутый, поэтому я не включаю никакой код, но с удовольствием загрузю его, если потребуется)

Редактировать: я не могу добавить изображение, так как я новый пользователь, но вы можете найти его здесь: http://img69.imageshack.us/img69/309/20100413190123.png

Версии: JQuery 1.3.2 и jquery-ui 1.7.2

1 Ответ

2 голосов
/ 14 апреля 2010

После хорошего сна и дальнейших исследований я нашел ответ на свой вопрос:

Когда перетаскиваемый объект начинает перетаскиваться, он рассчитывает позиции всех сбрасываемых объектов, которые могут его принять. По умолчанию позиции после этого не пересчитываются. Существует перетаскиваемая опция, которая вызывает пересчет для каждого события «перетаскивания»: refreshPositions, см .: http://jqueryui.com/demos/draggable/#option-refreshPositions

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

См .: http://groups.google.com/group/jquery-ui/browse_thread/thread/5a1fbb37ab8ef1a9?pli=1 и http://dev.jqueryui.com/ticket/4911

Примеры манекенов для ручного расчета пересчитываются только при необходимости: http://forum.jquery.com/topic/how-to-make-draggable-execute-refreshpositions-not-on-every-mousemove-but-with-a-specific-callback и http://trycatchfail.com/blog/post/2010/01/15/Work-around-for-jQuery-UI-Draggable-refresh-limitation.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...