Як відключити перетягування jquery-ui?


97

Як вимкнути перетягування jQuery, наприклад, під час повідомлення після оновлення UpdatePanel?

Відповіді:


148

Не вдалося створити функцію DisableDrag (myObject) та EnableDrag (myObject)

myObject.draggable( 'disable' )

Тоді

myObject.draggable( 'enable' )

2
Це працює. Повні документи для перетягування () знаходяться тут . Те ж саме стосується і угруповань () об'єктів (якщо ви дозволяєте перетягнути-н-падіння перепризначення.)
nickb

3
Що означає, що перетягувані () документи тут (зараз?) Тут , із посиланням на нікбю, переходять до демонстрації . ;)
jorffin

Це дає мені "не можна викликати методи перетягування перед ініціалізацією; намагався викликати метод" відключити ""
Хазеб Зулфікар

Міан Haseeb: Дивіться це: stackoverflow.com/questions/14955630 / ...
madcolor

68

Щоб тимчасово вимкнути поведінку, що перетягується, використовуйте:

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

Щоб назавжди видалити поведінку, що перетягується, виконайте наведені нижче дії.

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

6
Я виявив, що "відключити" має побічний ефект, пов'язаний з css, але руйнувати працює бездоганно.
Нільс Брінч

1
@jedanput побічним ефектом використання відключення є перетягувані елементи мають затьмарений вигляд. Знищення, здається, залишає зовнішній вигляд у спокої.
самазі

19

Щоб увімкнути / вимкнути перетягування в jQuery, я використав:

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

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

@Calciphus відповідь не допомогла мені з проблемою непрозорості, тому я використав:

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

Працювали і на мобільних пристроях.

Ось код: http://jsfiddle.net/nn5aL/1/


Схоже, ваша JSfiddle не працює. Кнопки не натискають (використовуючи останній Chrome). Я спробував оновити його на посилання та дзвінки, button()але це не допомогло.
ashes999

2
з усіх наведених рішень це єдине, що працювало на 100% для мене - всі інші (за допомогою комбінацій вимкнення / знищення тощо) просто не виправили проблему css. У своєму додатку за допомогою перетягування + падіння я виявив, що непрозорість відрізнялася для тих елементів, які були перетягнуті з моменту ініціалізації, порівняно з тими, до яких не торкалися. Всі дуже безладно. Завдяки @CarinaPilar як за рішення, так і jsfiddle, щоб довести це.
Енді Лоренц

11

Мені знадобилось трохи часу, щоб розібратися, як відключити перетягування при падінні - використовуйте ui.draggableдля посилання на об’єкт, який перетягується зсередини функції краплі:

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

HTH хтось


Дякую за це Здається, це рішення добре працює при використанні директив перетягування / відкидання в AngularJS.
Банджо Дріл

10

Здається, ніхто не переглядав оригінальну документацію. Може бути, його тоді не було))

Ініціалізуйте перетягування із вказаним параметром вимкнено.

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

Отримайте або встановіть опцію для відключення після init.

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

Це спрацьовує, але має побічний ефект, що робить мою діву близько 50% непрозорістю ... Я не маю поняття, чому.
Адвокат диявола

@ScottBeeson Кожного разу, коли ви вимикаєте щось у jQuery, він додає клас "ui-state-disabled". Ви можете видалити його за допомогою: $ (". Ui-draggable"). DeleteClass ("ui-state-disabled")
Кальціф

7

У випадку діалогового вікна у нього є властивість під назвою перетягування, встановіть її на значення false.

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

Попри те, що питання старе, я спробував запропонувати рішення, і це не спрацювало для діалогу. Сподіваюся, це може допомогти іншим, як я.


Я не впевнений, що питання конкретно пов’язане з діалоговими вікнами jQueryUI , але тим не менш, я знайшов вашу публікацію корисною.
Шон Ері

3

Далі - як це могло б виглядати всередині .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

У мене є більш просте та елегантне рішення, яке не змішує класи, стилі, непрозорість та інше.

Для елемента, який можна перетягнути - ви додаєте подію 'start', яка буде виконуватися кожного разу, коли ви намагаєтесь кудись перенести елемент. У вас буде умова, переїзд якої не є законним. Для незаконних ходів - запобігайте їм за допомогою 'e.preventDefault ();' як у наведеному нижче коді.

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

        }
    });

Будь ласка :)


0

Змінити draggableатрибут з

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

до

<span draggable="false">Label</span>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.