JQuery UI sortable - выполнить действие ДО запуска событий - PullRequest
12 голосов
/ 21 марта 2012

Я искал в STACKOVERFLOW и на других форумах решение моей проблемы - если я пропустил рабочее решение, укажите мне на него.

Моя проблема: Всякий раз, когда перетаскиваешь элемент (div портлета) в моем сортируемом списке, мне нужно выполнить какое-то действие ДО того, как начнется фактический процесс перетаскивания (из того, что я понимаю до запуска события START).

Чтобы быть более конкретным: Мои DIV предоставляют пользователю возможность расширять / сворачивать свое тело (как показано в примере на странице пользовательского интерфейса jquery http://jqueryui.com/demos/sortable/#portlets).

Всякий раз, когда вы перетаскиваете элемент, я хочу активировать метод свертывания, чтобы единственным перетаскиваемым визуальным элементом был свернутый DIV.

Однако всякий раз, когда я вызываю мой метод (что-то вроде этого)

$someitem.trigger("toggle.somenamespace") 

работает как положено, за исключением того, что ВЫСОТА перетаскиваемого хелпера вычисляется ПЕРЕД тем, как событие запуска запускается в сортируемом элементе, и, следовательно, хелпер имеет высоту исходного элемента в его не свернутом состоянии.

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

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

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

спасибо за любую помощь, Matthias

EDIT: Установка флага сортировки: forceHelperSize в true и установка размера ui.item / helper в начальном перетаскивателе также не работает, так как это приводит к желаемому эффекту визуально (перетаскивается только свернутый элемент, но останавливает перетаскивание элемента вниз полностью (как если бы предмет все еще имел высоту в своем свернутом состоянии) проверено помощником: «оригинал» и «клон»

Ответы [ 2 ]

14 голосов
/ 18 апреля 2012

Я долго искал это "решение":

$('.handle').each(function() {
    $(this).mousedown(function() {
        $(this).parent().parent().children('ol').hide('blind', 500);
    });
});

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

Это не элегантное решение, но оно работает - по крайней мере, в моей программе.

11 голосов
/ 20 сентября 2012

Вы можете сделать это, но это не является перспективой для будущих версий jQuery UI:

var oldMouseStart = $.ui.sortable.prototype._mouseStart;
$.ui.sortable.prototype._mouseStart = function(event, overrideHandle, noActivation) {
   this._trigger("CustomBeforeStart", event, this._uiHash());
   oldMouseStart.apply(this, [event, overrideHandle, noActivation]);
};

You can then use the new event when setting up the sortable:

$(".whatever").sortable({
  "CustomBeforeStart":function(e, ui) {
  }
  ...
});
...