Wie deaktiviere ich ein jquery-ui draggable?

97

Wie deaktiviere ich ein jQuery-Draggable, z. B. während eines UpdatePanel-Postbacks?

ErnieStings
quelle

Antworten:

148

Könnte eine DisableDrag (myObject) - und eine EnableDrag (myObject) -Funktion erstellen

myObject.draggable( 'disable' )

Dann

myObject.draggable( 'enable' )
Madcolor
quelle
2
Das funktioniert. Vollständige Dokumente für draggable () finden Sie hier . Gleiches gilt für sortierbare () Objekte (wenn Sie eine Neuordnung per Drag & Drop
zulassen
3
Das heißt, dass die ziehbaren () Dokumente (jetzt?) Hier sind , wobei der Link von Nickb oben zur Demo führt . ;)
Ruffin
Dies gibt mir "kann keine Methoden auf Draggable vor der Initialisierung aufrufen; versucht, Methode '
disable
Mian Haseeb: Siehe dies: stackoverflow.com/questions/14955630/…
madcolor
68

Um das ziehbare Verhalten vorübergehend zu deaktivieren, verwenden Sie:

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

Um das ziehbare Verhalten dauerhaft zu entfernen, verwenden Sie:

$('#item-id').draggable( "destroy" )
PhilB
quelle
6
Ich fand, dass 'Deaktivieren' eine CSS-bezogene Nebenwirkung hat, aber das Zerstören funktioniert einwandfrei.
Niels Brinch
1
@jedanput Der Nebeneffekt der Verwendung von disable ist, dass die ziehbaren Elemente ein ausgegrautes Erscheinungsbild haben. zerstören scheint das Aussehen in Ruhe zu lassen.
Samazi
19

Um Draggable in jQuery zu aktivieren / deaktivieren, habe ich Folgendes verwendet:

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

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

@ Calciphus Antwort hat bei mir mit dem Opazitätsproblem nicht funktioniert, also habe ich verwendet:

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

Arbeitete auch auf mobilen Geräten.

Hier ist der Code: http://jsfiddle.net/nn5aL/1/

CarinaPilar
quelle
Ihre JSfiddle scheint nicht zu funktionieren. Die Schaltflächen klicken nicht (mit dem neuesten Chrome). Ich habe versucht, es auf Links zu aktualisieren und anzurufen, button()aber das hat nicht geholfen.
Asche999
2
Von allen angegebenen Lösungen war diese die einzige, die zu 100% für mich funktioniert hat - alle anderen (mit Kombinationen aus Deaktivieren / Zerstören usw.) haben das CSS-Problem einfach nicht behoben. In meiner App mit Drag + Drop stellte ich fest, dass die Deckkraft für die Elemente, die seit der Initialisierung gezogen wurden, anders war als für die Elemente, die nicht berührt wurden. Alles sehr chaotisch. Vielen Dank an @CarinaPilar für die Lösung und die jsfiddle, um dies zu beweisen.
Andy Lorenz
11

Es hat eine Weile gedauert, bis ich herausgefunden habe, wie Draggable beim Ablegen deaktiviert werden kann. Verwenden Sie diese Option, um ui.draggableauf das Objekt zu verweisen, das aus der Drop-Funktion gezogen wird:

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

HTH jemand

Oli Studholme
quelle
Danke dafür. Diese Lösung scheint gut zu funktionieren, wenn in AngularJS ziehbare / ablegbare Anweisungen verwendet werden.
Banjo Drill
10

Es scheint, als hätte niemand die Originaldokumentation angesehen. Vielleicht gab es damals noch kein))

Initialisieren Sie ein Draggable mit der angegebenen deaktivierten Option.

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

Holen Sie sich die deaktivierte Option nach init oder setzen Sie sie.

//getter
var disabled = $( ".selector" ).draggable( "option", "disabled" );
//setter
$( ".selector" ).draggable( "option", "disabled", true );
makaroni4
quelle
Dies funktioniert, hat aber den Nebeneffekt, dass mein Div ungefähr 50% Deckkraft hat ... Ich habe keine Ahnung warum.
Devil's Advocate
@ScottBeeson Jedes Mal, wenn Sie etwas in jQuery deaktivieren, wird die Klasse "ui-state-disabled" hinzugefügt. Sie können es entfernen mit: $ (". UI-draggable"). RemoveClass ("ui-state-disabled")
Calciphus
7

Im Falle eines Dialogfelds hat es eine Eigenschaft namens draggable. Setzen Sie sie auf false.

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

Obwohl die Frage alt ist, habe ich die vorgeschlagene Lösung ausprobiert und sie hat für den Dialog nicht funktioniert. Hoffe das kann anderen wie mir helfen.

Andrei C.
quelle
Ich bin mir nicht sicher , ob die Frage speziell auf jQueryUI verwendet Dialoge , aber ich fand dennoch Ihr Beitrag hilfreich.
Shawn Eary
3

Das Folgende ist, wie dies innerhalb von aussehen würde .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
});
Maudulus
quelle
3

Ich habe eine einfachere und elegantere Lösung, die Klassen, Stile, Trübungen und andere Dinge nicht durcheinander bringt.

Für das ziehbare Element fügen Sie ein 'Start'-Ereignis hinzu, das jedes Mal ausgeführt wird, wenn Sie versuchen, das Element irgendwohin zu verschieben. Sie haben eine Bedingung, deren Umzug nicht legal ist. Für illegale Bewegungen - verhindern Sie sie mit 'e.preventDefault ();' wie im Code unten.

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

        }
    });

Bitte schön :)

Kombinieren
quelle
0

draggableAttribut ändern von

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

zu

<span draggable="false">Label</span>
ddagsan
quelle