Wie deaktiviere ich ein jquery-ui draggable?


97

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

Antworten:


148

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

myObject.draggable( 'disable' )

Dann

myObject.draggable( 'enable' )

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


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" )

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/


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


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

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.


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

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 :)


0

draggableAttribut ändern von

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

zu

<span draggable="false">Label</span>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.