2011-05-06 19 views
7

Primera pregunta, así que sean amables :)jQuery reversión pueda arrastrar y dejar de evento

Lo que estoy tratando de hacer es llamar a una función cuando el usuario suelta el que pueden arrastrarse, y antes de la animación de reversión se ha completado.

Por lo que puedo ver, el evento de detención se invoca solo cuando la reversión ha finalizado. He intentado pasar una función a la opción revertir de arrastrar, pero parece que no funciona. Aquí hay un poco de mi código para demostrar;

$("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"); 
    } 
}); 

Si descomentar la primera línea de la función de reversión - fadeout - a continuación, el elemento se desvanece, pero no vuelve. La consola solo registra "fin" cuando la animación de revertir se ha completado.

¿Alguien me puede ayudar? Huelga decir que he buscado mucho en Google una respuesta, pero sin suerte.

Buster

Respuesta

11

primer lugar, según this blog, el indocumentado revert de devolución de llamada sólo se necesita un solo argumento (el objeto socket gota, o el booleano false si se rechazó la gota).

Ahora, el problema es que draggable usa internamente para cambiar la posición del ayudante. Aparentemente, esa animación se pone en cola y solo comienza después de que finalice su efecto fadeOut.

Una forma de lograr lo que desea es realizar la llamada a animate() a sí mismo, así:

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; 
    } 
} 

Eso permite que el ayudante pueda arrastrar a desvanecen mientras está siendo revertida.

Puede probar esa solución here.

+0

Gracias, eso es muy útil. Me pregunto por qué la devolución de llamada revertida permanece sin documentar. De hecho, me pregunto por qué la documentación de la interfaz de usuario de jquery en general es tan pobre en comparación con jquery core. ¡Gracias de nuevo! – BusterLuke

+1

está en el camino correcto, pero llamar a originalPosition literalmente no devuelve nada, incluso con su jsfiddle. No estoy seguro de dónde encontraste esta parte porque llamar a .animate (indefinido) básicamente no hace nada. La animación de revertir es en realidad el resultado de regresar verdadero desde dentro de la función de devolución de llamada. Así que, básicamente, lo que está haciendo su código es simplemente eludir la 'puesta en cola' de la animación, lo que le permite ejecutarse simultáneamente con cualquier otra animación que elija poner en su función de devolución de llamada seguida de regresar verdadera. Conclusión: eliminar este .animate ($ helper.originalPosition); – mkralla11

+0

@Mike, tiene toda la razón, '$ helper.originalPosition' está realmente' 'undefined'' durante el evento' revert'. Sin embargo, al eliminar la llamada a 'animate (undefined)', el ítem no se revierte y se desvanece "en su lugar". Definitivamente hay algo de sombra aquí ... –

Cuestiones relacionadas