2009-08-24 9 views

Respuesta

136

podría crear un DisableDrag (myObject) y una función EnableDrag (myObject)

myObject.draggable('disable') 

Entonces

myObject.draggable('enable') 
+2

Esto funciona. Los documentos completos para draggable() son [aquí] (http://jqueryui.com/demos/draggable/#options). Lo mismo ocurre con los objetos ordenables() (si está permitiendo el reordenamiento de arrastrar y soltar). – nickb

+3

Lo que quiere decir que [los documentos arrastrables() son (¿ahora?) Aquí] (http://api.jqueryui.com/draggable /), con el enlace de nickb, arriba, yendo [a la demostración] (http://jqueryui.com/draggable/). ;) – ruffin

+0

Esto me da "no se puede llamar a los métodos que se pueden arrastrar antes de la inicialización; intenté llamar al método 'deshabilitar'" –

11

Me tomó un poco de tiempo para averiguar cómo desactivar pueda arrastrar en la caída de usar ui.draggable para hacer referencia al objeto que está siendo arrastrado desde el interior de la función de caída:

$("#drop-target").droppable({ 
    drop: function(event, ui) { 
     ui.draggable.draggable("disable", 1); // *not* ui.draggable("disable", 1); 
     … 
    } 
}); 

HTH alguien

+0

Gracias por esto. Esta solución parece funcionar bien cuando se usan directivas arrastrables/desplegables en AngularJS. –

61

Para desactivar temporalmente el uso que pueden arrastrarse comportamiento:

$('#item-id').draggable("disable") 

Para retirar el comportamiento que pueden arrastrarse utilizar de forma permanente:

$('#item-id').draggable("destroy") 
+6

Descubrí que 'disable' tiene un efecto secundario relacionado con css, pero destroy funciona sin problemas. –

+2

Quizás podría señalar ese efecto secundario también. –

+1

@jedanput el efecto secundario de usar deshabilitar es que los elementos que se pueden arrastrar tienen una apariencia gris. destruir parece dejar la apariencia solo. – samazi

9

parece que nadie miraba a la documentación original. Puede ser que no había en ese momento))

inicializar una arrastrable con la opción desactivada especificado.

$(".selector").draggable({ disabled: true }); 

Obtiene o establece la opción deshabilitada, después de iniciar.

//getter 
var disabled = $(".selector").draggable("option", "disabled"); 
//setter 
$(".selector").draggable("option", "disabled", true); 
+0

Esto funciona, pero tiene un efecto secundario de hacer que mi div tenga aproximadamente el 50% de opacidad ... No tengo idea de por qué. –

+0

@ScottBeeson Cada vez que deshabilita algo en jQuery, agrega la clase "ui-state-disabled". Puede eliminarlo con: $ (".ui-draggable"). RemoveClass ("ui-state-disabled") – Calciphus

6

En el caso de un cuadro de diálogo, tiene una propiedad llamada "arrastrable", configúrelo como falso.

$("#yourDialog").dialog({ 
    draggable: false 
}); 

Aunque la pregunta es antigua, probé la solución propuesta y no funcionó para el diálogo. Espero que esto ayude a otros como yo.

+0

No estoy seguro de si la pregunta está relacionada específicamente con jQueryUI * Dialogs *, pero encontré su publicación útil, sin embargo. –

15

Para activar/desactivar arrastrable en jQuery utilicé:

$("#draggable").draggable({ disabled: true });   

$("#draggable").draggable({ disabled: false }); 

@Calciphus respuesta no funcionó para mí con el problema de la opacidad, así que utilicé:

div.ui-state-disabled.ui-draggable-disabled {opacity: 1;} 

trabajado en dispositivos móviles ya sea.

Aquí está el código: http://jsfiddle.net/nn5aL/1/

+0

Su JSfiddle no parece estar funcionando. Los botones no hacen clic (usando el último Chrome). Traté de actualizarlo a enlaces y llamar 'button()' pero eso no ayudó. – ashes999

+0

@ ashes999, tengo el último Chrome (30.0.1599.101) y aún funciona ... – CarinaPilar

+2

de todas las soluciones dadas, esta fue la única que funcionó 100% para mí, todas las demás (usando combinaciones de desactivar/destruir etc.) simplemente no corrigió el problema css. En mi aplicación, usando la función arrastrar y soltar, encontré que la opacidad era diferente para los elementos que se habían arrastrado desde la inicialización en comparación con los que no se habían tocado. Todo muy desordenado. Gracias a @CarinaPilar tanto por la solución como por jsfiddle para demostrarlo. –

2

Lo siguiente es lo que esto se vería como en el interior de .draggable({});

$("#yourDraggable").draggable({ 
    revert: "invalid" , 
    start: function(){ 
     $(this).css("opacity",0.3); 
    }, 
    stop: function(){ 
     $(this).draggable('disable') 
    }, 
    opacity: 0.7, 
    helper: function() { 
     $copy = $(this).clone(); 
     $copy.css({ 
      "list-style":"none", 
      "width":$(this).outerWidth() 
     }); 
     return $copy; 
    }, 
    appendTo: 'body', 
    scroll: false 
}); 
0

Cambio draggable atributo de

<span draggable="true">Label</span> 

a

<span draggable="false">Label</span> 
2

tengo una solución simple y elegante que no pierde el tiempo con las clases, estilos, opacidades y esas cosas.

Para el elemento arrastrable: agregue el evento 'inicio' que se ejecutará cada vez que intente mover el elemento a alguna parte. Tendrás una condición que mover no es legal. Para los movimientos que son ilegales, evítelos con 'e.preventDefault();' como en el código de abajo

$(".disc").draggable({ 
     revert: "invalid", 
     cursor: "move", 
     start: function(e, ui){     
      console.log("element is moving"); 

      if(SOME_CONDITION_FOR_ILLEGAL_MOVE){ 
       console.log("illegal move"); 
       //This will prevent moving the element from it's position 
       e.preventDefault(); 
      }  

     } 
    }); 

que son bienvenidos :)

Cuestiones relacionadas