Задать вопрос
ruskar
@ruskar
Conflict Intelligence Team

Произвести модификацию в jQuery UI и получить сжатый вариант?

Некоторое время назад я писал о том, что пишу некий «аналог jQuery Treeview». Благодаря подсказке nikitammf проблему «отпрыгивающего элемента» я поборол.

Но появилась другая проблема. Чтобы описать её, я сначала объясню каким образом плагин jQuery UI Draggable определяет находится ли в данный момент переносимый элемент над droppable-элементом.



В момент начала переноса захваченного элемента вызывается метод $.ui.ddmanager.prepareOffsets(this, event) (строка 152 файла /development-bundle/ui/jquery.ui.draggable.js). Этот метод запоминает в кэше абсолютные координаты всех droppable-элементов. Затем в процессе переноса draggable-элемента, его меняющиеся координаты постоянно сверяются с координатами droppable-элементов из кэша, и когда наступает пересечение координат — плагин опознаёт, что захваченный элемент оказался над тем-то droppable-элементом (т.е. наступает событие «hover»). Кэш координат droppable-элементов всегда рассчитывается только один раз — в момент начала переноса захваченного элемента.



Как это конфликтует с моим кодом? Как я уже писал, в момент наступления события «hover» у меня отсылается запрос на сервер, который возвращает список дочерних элементов, которые вставляются вложенным списком. Поскольку вставляется вложенный список, координаты последующих (лежащих ниже) droppable-элементов при этом меняются, но кэш координат об этом не знает.

В результате если захватить самый первый элемент, задержать над вторым элементом (дождавшись появления вложенного списка) и дальше вести его вниз, то третий и последующий элементы среагируют ещё задолго до того, как перетаскиваемый элемент реально окажется над ними (потому что в кэше координат остались старые координаты и он по-прежнему думает, что все droppable-элементы остались на своих изначальных местах).

Как решить эту проблему, впринципе понятно: пересчитать кэш координат (вызвать метод $.ui.ddmanager.prepareOffsets(this, event)) после вставки дочернего списка.

Но так просто вызвать этот метод не получается: его имя уже изменено в процессе компоновки и минимизации конструктором jQuery UI (я использую не гигантский архив с кучей js-файлов, а собранный конструктором один файл).

Как здесь быть? Как вызвать метод, имя которого уже «обфусцировано»?



Онлайн-пример собственно моей разработки тут.
  • Вопрос задан
  • 3055 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
ruskar
@ruskar Автор вопроса
Conflict Intelligence Team
Решение уже нашёл сам. Как всегда всё оказалось гораздо проще: не заметил в документации, что у jQuery UI draggable есть опция refreshPositions и если её установить в true, то позиции droppable-элементов будут обновляться при каждом движении мыши.
С другой стороны, для экономии ресурсов компьютера, всё равно хотелось бы научиться обновлять позиции элементов не при каждом движении мыши, а только тогда, когда нужно, вызывая соответствующий метод.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Mithgol
@Mithgol
Предлагаю Вам воспользоваться средством автоматической записи джаваскрипта в красивом виде, которое запишет сжатый код в структурированном виде, хотя, естественно, не восстановит первоначальные названия укороченных идентификаторов (переменных, полей, функций, методов, и так далее).

Затем, методом пристального вглядывания, Вы сможете определить в нём имя желаемого метода (сравнив его содержимое с известным Вам содержимым первоначального несжатого кода того же метода и убедившись в их логической одинаковости). Используйте найденное имя в своём вызове, и тем невозбранно достигнете желаемого.
Ответ написан
Mithgol
@Mithgol
Более радикальным методом решения этой проблемы является отказ от стандартного конструктора-упаковщика, предлагаемого на сайте jQuery UI, и переход к собственноручному склеиванию желаемых файлов джаваскрипта встык, с дальнейшей упаковкою их собственноручно же — притом с именно такой упаковкою, которая не изменяет имена методов, так что не создаёт описанной Вами проблемы.

Для этой цели, например, можно использовать прославленный упаковщик Дина Эдвардса, поставив ему в настройках галочку «Base62 encode», но сняв галочку «Shrink variables».
Ответ написан
Комментировать
@Disturbed
Напишите feature request в их багтрекер :)
Ответ написан
Комментировать
3ds
@3ds
А почему если список был открыт и элементы подгрузились а потом закрыт, при повторном открытии они опять грузятся? Может сделать флаг, загружены или нет? Или это критично и пункты так часто обновляются? (немного оффquestion) (:
Ответ написан
nikitammf
@nikitammf
можно воспользоваться методом «option» у draggable и выставлять опцию на пересчет при обновления после подгрузки элементов, потом снова убирать ее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
OfferCase Москва
от 400 000 ₽
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
Future Москва
от 50 000 до 70 000 ₽