jQuery перетаскиваемое событие возврата и остановки

#jquery #jquery-ui #draggable

#jquery #jquery-пользовательский интерфейс #перетаскиваемый

Вопрос:

Первый вопрос, так что будьте добры 🙂

То, что я пытаюсь сделать, это вызвать функцию, когда пользователь отпускает перетаскиваемый объект и до завершения анимации возврата.

Насколько я могу видеть, событие stop вызывается только тогда, когда возврат завершен. Я попытался передать функцию опции возврата перетаскиваемого, но, похоже, это не работает. Вот фрагмент моего кода для демонстрации;

 $("a").draggable({
    helper:function(){
        return $("<div/>",{id:"mydrag",text:"link"}).appendTo("body");
    },
    revert:function(evt,ui){
        // $("#mydrag").fadeOut("slow");
        return true;
    },
    stop:function(evt,ui){
        console.log("fin");
    }
});
  

Если я раскомментирую первую строку функции возврата — fadeout — тогда элемент исчезнет, но не вернется. Консоль регистрирует «fin» только после завершения анимации возврата.

Кто-нибудь может мне помочь? Излишне говорить, что я много гуглил в поисках ответа, но безуспешно.

Сбой

Ответ №1:

Во-первых, согласно этому блогу, недокументированный revert обратный вызов принимает только один аргумент (объект drop socket или логическое значение, false если удаление было отклонено).

Теперь проблема в том, что draggable используется animate() внутренне для изменения положения помощника. По-видимому, эта анимация попадает в очередь и запускается только после завершения вашего fadeOut эффекта.

Один из способов достичь желаемого — выполнить вызов animate() самому себе, вот так:

 revert: function(socketObj) {
    if (socketObj === false) {
        // Drop was rejected, revert the helper.
        var $helper = $("#mydrag");
        $helper.fadeOut("slow").animate($helper.originalPosition);
        return true;
    } else {
        // Drop was accepted, don't revert.
        return false;
    }
}
  

Это позволяет перетаскиваемому помощнику исчезать во время его возврата.

Вы можете протестировать это решение здесь.

Комментарии:

1. Спасибо, это очень полезно. Интересно, почему обратный вызов revert остается недокументированным? На самом деле, мне интересно, почему документация jquery UI в целом настолько плоха по сравнению с jquery core. Еще раз спасибо!

2. вы на правильном пути, но вызов originalPosition буквально ничего не возвращает, даже с вашим jsfiddle. Не уверен, где вы нашли эту часть, потому что вызов .animate (undefined) по сути ничего не делает. Анимация возврата на самом деле все еще является результатом возврата true из вашей функции обратного вызова. Итак, по сути, то, что делает ваш код, — это просто обход «очереди» анимации, позволяя ей выполняться одновременно с любой другой анимацией, которую вы решите поместить в свою функцию обратного вызова, за которой следует возврат true . Вывод: удалите this .animate($helper.originalPosition);

3. @Mike, ты абсолютно прав, $helper.originalPosition это действительно undefined во время revert события. Однако удаление вызова animate(undefined) приводит к тому, что элемент не возвращается и исчезает «на месте». Здесь определенно есть что-то сомнительное…