2010-06-21 17 views
28

tengo un elemento que es posible arrastrar y un elemento que es lanzables. Una vez que el elemento arrastrado se coloca en la zona de saltos que estoy tratando de ejecutar el siguiente pseudo código jQuery:cómo revertir la posición de una interfaz de usuario jQuery que pueden arrastrarse en función del estado

if(draggedelement == value){ 

$(draggedelement).hide(); 

} 
else{ 

$(draggedelement).revert(); 

} 

donde la función revert() mueve el elemento arrastrado de nuevo a su Postion originales.

¿Cómo se podría lograr esto?

P.S. Soy consciente de la opción 'revertir' arrastrable, sin embargo, esto solo se activa si el elemento arrastrado no llega a la zona de caída.

Respuesta

70

Hay hay algunas opciones incorporadas para esto, en su .draggable(), establezca revert option en 'invalid', y volverá si no fuera así. se redujo con éxito en un lanzables, así:

$("#draggable").draggable({ revert: 'invalid' }); 

Luego, en su .droppable() conjunto lo que es válido para una caída utilizando el accept option, por ejemplo:

$("#droppable").droppable({ accept: '#draggable' });​ 

Cualquier cosa que no coincida con este selector consigue restablecer cuando se deja ir, you can see a full demo here. La opción de aceptar también tiene una función de si necesita filtrar un selector no puede proporcionar, de esta manera:

$("#droppable").droppable({ 
    accept: function(dropElem) { 
    //dropElem was the dropped element, return true or false to accept/refuse it 
    } 
});​ 
+2

+1 ¡gran ayuda! ¡Gracias! – Sisir

4

Trate de añadir el código en el evento "soltar". Aquí hay un demo.

HTML

<div class="draggable ui-widget-content correct"><p>1</p></div> 
<div class="draggable ui-widget-content"><p>2</p></div> 
<div class="draggable ui-widget-content"><p>3</p></div> 
<div class="draggable ui-widget-content"><p>4</p></div> 
<br style="clear: both"> 
<div id="droppable" class="ui-widget-header"> 
    <p>Drop me here</p> 
</div> 

Guión

$(function() { 

$(".draggable").draggable({ revert: true }); 

$("#droppable").droppable({ 
    activeClass: 'ui-state-hover', 
    hoverClass: 'ui-state-active', 
    // uncomment the line below to only accept the .correct class.. 
    // Note: the "drop" function will not be called if not ".correct" 
    // accept : '.correct', 
    drop: function(event, ui) { 
    // alternative method: 
    // if (ui.draggable.find('p').text() == "1") { 
    if (ui.draggable.is('.correct')) { 
    $(this).addClass('ui-state-highlight').find('p').html('You got it!'); 
    // cloning and appending prevents the revert animation from still occurring 
    ui.draggable.clone(true).css('position', 'inherit').appendTo($(this)); 
    ui.draggable.remove(); 
    } else { 
    $('#droppable > p').html('Not that one!') 
    setTimeout(function(){ $('#droppable > p').html('Drop here'); }, 1000); 
    } 
    } 
}); 

}); 

Como se puede ver en la secuencia de comandos, puede buscar la clase .correct o el texto dentro (comentada línea)

1
$("#droppable").droppable({ 
    accept: function(dropElem) { 
     //dropElem was the dropped element, return true or false to accept/refuse it 
     if($(this).data('stoneclass') == dropElem.attr("id")){ 
      return true; 
    } 
} 
});​ 

Esto se utilizó para aceptar sólo uno se pueda arrastrar, a partir de un grupo de draggables; a uno correcto droppable, en un grupo de droppables.

P.S siento por el idioma si no se entiende =)

4

tuve un caso de uso donde tenía que ejecutar alguna lógica en el método de la gota de lanzables para determinar si el arrastrable debería volver. I usó el siguiente para lograrlo:

$('.draggable-elements').draggable({ 
 
    revert: function() { 
 
    if ($(this).hasClass('drag-revert')) { 
 
     $(this).removeClass('drag-revert'); 
 
     return true; 
 
    } 
 
    } 
 
}); 
 

 
$('.droppable-elements').droppable({ 
 
    drop: function(event, ui) { 
 
    if (% conditional logic check here %) { 
 
     return $(ui.draggable).addClass('drag-revert'); 
 
    } 
 
    } 
 
});

Mi caso de uso es una tabla donde cada célula es una lanzables que representa un periodo de 5 minutos. Mis arrastrables son reservas que comienzan en una celda, pero se ejecutan en muchas celdas seguidas para representar el tiempo de reserva.

yo no quería ningún draggables que se superponen, ya que ello representaría una doble reserva. Entonces, después de la caída, encuentro todas las arrastrables en la fila, excluyendo la que acabo de mover, y verifico cualquier superposición.Si hay una superposición, mi lógica condicional devuelve verdadero y revertir el arrastrable.

La siguiente etapa es disparar una llamada ajax para actualizar la base de datos, si la lógica del lado del servidor dice que el movimiento no es válido, espero devolver un estado de error y revertir el arrastrable.

P.S. esta es mi primera respuesta, lo siento si he hecho algo mal. Consejos sobre cómo proporcionar buenas respuestas aceptados con gusto.

Editar: Después de probar mi llamada AJAX, me di cuenta de que hay una ventana de oportunidad para que la función droppable.drop lo haga antes de que se ejecute la función draggable.revert. Para cuando mi llamada AJAX devolvió false, la ventana ya había pasado y la clase se agregaba demasiado tarde para que se pueda arrastrar.revertir para reaccionar.

Como tal, ya no estoy confiando en la función draggable.revert, en vez actuando únicamente sobre la respuesta AJAX y si es falso, usando animado() para devolver el que pueden arrastrarse a su posición original, de la siguiente manera:

$('.draggable-elements').draggable(); 
 

 
$('.droppable-elements').droppable({ 
 
    drop: function(event, ui) { 
 
    var postData = { 
 
     id: 1, 
 
     ... 
 
    }; 
 
    $.post('/ajax/url', postData, function(response) { 
 
     var response = $.parseJSON(response); 
 
     if (response.status != 1) { 
 
     return ui.draggable.animate({left: 0, top: 0}, 500); 
 
     } 
 
    } 
 
    } 
 
});

Es posible que necesite tener draggable.start/arrastre sumar los valores superiores de la izquierda se puede arrastrar original y como atributos de los datos, pero para mí lo anterior trabajado bien.

0

Descubrí que si simplemente configuro la parte superior: 0 y hacia la izquierda: 0, el elemento ya no se puede arrastrar. Para "forzar" un revertir, tuve que hacer esto:

$draggedObj.css({ top: 0, left: 0 }) 
$draggedObj.draggable("destroy") 
$draggedObj.draggable({...whatever my draggable options are...}); 
Cuestiones relacionadas