Jak wyłączyć możliwość przeciągania jQuery-ui?


99

Jak wyłączyć możliwość przeciągania jQuery, np. Podczas ogłaszania zwrotnego UpdatePanel?

Odpowiedzi:


148

Mogło utworzyć funkcję DisableDrag (myObject) i EnableDrag (myObject)

myObject.draggable( 'disable' )

Następnie

myObject.draggable( 'enable' )

2
To działa. Pełne dokumenty dla draggable () są tutaj . To samo dotyczy obiektów sortable () (jeśli
zezwalasz na

3
To znaczy, że dokumenty draggable () są (teraz?) Tutaj , z linkiem nickba powyżej, przechodząc do wersji demonstracyjnej . ;)
ruffin

To daje mi „nie można wywołać metody na przeciągany przed inicjalizacji; próbowali metody wywołania«wyłącz»”
Haseeb zulfikar


69

Aby tymczasowo wyłączyć zachowanie, które można przeciągać, użyj:

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

Aby trwale usunąć zachowanie, które można przeciągać, użyj:

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

6
Odkryłem, że „wyłącz” ma efekt uboczny związany z CSS, ale niszczenie działa bez zarzutu.
Niels Brinch

1
@jedanput Efektem ubocznym używania funkcji disable jest to, że elementy, które można przeciągać, są wyszarzone. zniszczenie wydaje się pozostawić wygląd w spokoju.
samazi

19

Aby włączyć / wyłączyć draggable w jQuery, których użyłem:

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

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

Odpowiedź @Calciphus nie działała dla mnie z problemem krycia, więc użyłem:

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

Pracował również na urządzeniach mobilnych.

Oto kod: http://jsfiddle.net/nn5aL/1/


Wygląda na to, że Twój JSfiddle nie działa. Przyciski nie klikają (w najnowszej wersji Chrome). Próbowałem zaktualizować go do linków i dzwonić, button()ale to nie pomogło.
popioły 999

2
Spośród wszystkich podanych rozwiązań, to było jedyne, które działało dla mnie w 100% - wszystkie inne (używając kombinacji wyłącz / zniszcz itp.) po prostu nie rozwiązały problemu z css. W mojej aplikacji za pomocą przeciągnij + upuść zauważyłem, że krycie było inne dla tych elementów, które zostały przeciągnięte od momentu inicjalizacji, w porównaniu z tymi, które nie zostały dotknięte. Wszystko bardzo niechlujne. Podziękowania dla @CarinaPilar za rozwiązanie i jsfiddle, aby to udowodnić.
Andy Lorenz

11

Zajęło mi trochę czasu, zanim dowiedziałem się, jak wyłączyć możliwość przeciągania podczas upuszczania - użyj ui.draggabledo odniesienia się do obiektu przeciąganego z wnętrza funkcji upuszczania:

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

Ktoś HTH


Dzięki za to. Wydaje się, że to rozwiązanie działa dobrze podczas używania dyrektyw draggable / droppable w AngularJS.
Banjo Drill,

10

Wygląda na to, że nikt nie zajrzał do oryginalnej dokumentacji. Może nie było go wtedy))

Zainicjuj plik do przeciągania z określoną wyłączoną opcją.

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

Pobierz lub ustaw opcję wyłączoną po inicjalizacji.

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

To działa, ale ma efekt uboczny polegający na tym, że mój div ma około 50% krycia ... Nie mam pojęcia, dlaczego.
Devil's Advocate

@ScottBeeson Za każdym razem, gdy wyłączasz coś w jQuery, dodaje to klasę „ui-state-disabled”. Możesz go usunąć za pomocą: $ (". Ui-draggable"). RemoveClass ("ui-state-disabled")
Calciphus

7

W przypadku okna dialogowego ma właściwość o nazwie draggable, ustaw ją na false.

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

Chociaż pytanie jest stare, wypróbowałem proponowane rozwiązanie i nie zadziałało w przypadku okna dialogowego. Mam nadzieję, że to pomoże innym takim jak ja.


Nie jestem pewien, kwestia jest szczególnie związane z jQueryUI Dialogi , ale znalazłem Twój post jako mimo wszystko.
Shawn Eary

3

Poniżej opisano, jak to wyglądałoby w środku .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

Mam prostsze i eleganckie rozwiązanie, które nie psuje klas, stylów, krycia i innych rzeczy.

W przypadku elementu do przeciągania - dodajesz zdarzenie „start”, które będzie wykonywane za każdym razem, gdy spróbujesz gdzieś przenieść element. Będziesz mieć stan, w którym ruch jest niezgodny z prawem. W przypadku ruchów, które są nielegalne - zapobiegaj im za pomocą 'e.preventDefault ();' jak w kodzie poniżej.

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

        }
    });

Zapraszamy :)


0

Zmień draggableatrybut z

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

do

<span draggable="false">Label</span>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.