ฉันจะปิดการใช้งาน jquery-ui draggable ได้อย่างไร


101

ฉันจะปิดใช้งาน jQuery draggable ได้อย่างไรเช่นในระหว่างการโพสต์แบ็ค UpdatePanel

คำตอบ:


149

สามารถสร้าง DisableDrag (myObject) และฟังก์ชัน EnableDrag (myObject)

myObject.draggable( 'disable' )

แล้ว

myObject.draggable( 'enable' )

2
นี้ได้ผล เอกสารเต็มรูปแบบสำหรับลาก () เป็นที่นี่ เช่นเดียวกันกับวัตถุ sortable () (หากคุณอนุญาตให้จัดลำดับใหม่แบบลาก n - วาง)
nickb

3
ซึ่งก็คือการบอกว่าลาก () เอกสารเป็น (ตอนนี้?) ที่นี่มีการเชื่อมโยง nickb ของดังกล่าวข้างต้นจะไปสาธิต ;)
ruffin

สิ่งนี้ทำให้ฉัน "ไม่สามารถเรียกเมธอดที่ลากได้ก่อนการเริ่มต้นพยายามเรียกเมธอด 'ปิดการใช้งาน'"
Haseeb Zulfiqar

Mian Haseeb: ดูสิ่งนี้: stackoverflow.com/questions/14955630/…
madcolor

70

หากต้องการปิดใช้งานพฤติกรรมลากได้ชั่วคราวให้ใช้:

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

หากต้องการลบพฤติกรรมที่ลากได้อย่างถาวรให้ใช้:

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

6
ฉันพบว่า 'ปิดการใช้งาน' มีผลข้างเคียงที่เกี่ยวข้องกับ css แต่ทำลายงานได้อย่างไม่มีที่ติ
Niels Brinch

1
@jedanput ผลข้างเคียงของการใช้ disable คือองค์ประกอบที่ลากได้มีลักษณะเป็นสีเทา การทำลายดูเหมือนจะทิ้งรูปลักษณ์ไว้เพียงอย่างเดียว
samazi

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 ในการพิสูจน์
Andy Lorenz

11

ฉันใช้เวลาพอสมควรในการหาวิธีปิดการใช้งานการลากเมื่อวาง - ใช้ui.draggableเพื่ออ้างอิงวัตถุที่ลากจากภายในฟังก์ชันวาง:

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

HTH คน


ขอบคุณสำหรับสิ่งนี้. โซลูชันนี้ดูเหมือนจะทำงานได้ดีเมื่อใช้คำสั่งลาก / หยดได้ใน AngularJS
Banjo Drill

10

ดูเหมือนว่าไม่มีใครดูเอกสารต้นฉบับ อาจจะไม่มีตอนนั้นก็ได้))

เริ่มต้นการลากด้วยตัวเลือกปิดใช้งานที่ระบุ

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

รับหรือตั้งค่าตัวเลือกปิดใช้งานหลังจากเริ่มต้น

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

วิธีนี้ใช้งานได้ แต่มีผลข้างเคียงในการทำให้ div ของฉันมีความทึบประมาณ 50% ... ฉันไม่รู้ว่าทำไม
Devil's Advocate

@ScottBeeson ทุกครั้งที่คุณปิดใช้งานบางอย่างใน jQuery มันจะเพิ่มคลาส "ui-state-disabled" คุณสามารถลบออกได้ด้วย $ (". ui-draggable"). removeClass ("ui-state-disabled")
Calciphus

7

ในกรณีของกล่องโต้ตอบจะมีคุณสมบัติที่เรียกว่าลากได้ตั้งค่าเป็นเท็จ

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

แม้ว่าคำถามจะเก่า แต่ฉันลองใช้วิธีแก้ปัญหาที่เสนอแล้ว แต่ก็ใช้ไม่ได้กับกล่องโต้ตอบ หวังว่านี่อาจช่วยคนอื่น ๆ เช่นฉัน


ฉันไม่แน่ใจว่าคำถามเกี่ยวข้องกับ jQueryUI Dialogs เป็นพิเศษ แต่ฉันพบว่าโพสต์ของคุณมีประโยชน์
Shawn Eary

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

ฉันมีวิธีแก้ปัญหาที่เรียบง่ายและสง่างามที่ไม่ทำให้ชั้นเรียนสไตล์โอปปาติกะและสิ่งของต้องวุ่นวาย

สำหรับองค์ประกอบที่ลากได้ - คุณเพิ่มเหตุการณ์ 'เริ่ม' ซึ่งจะดำเนินการทุกครั้งที่คุณพยายามย้ายองค์ประกอบไปที่ใดที่หนึ่ง คุณจะมีเงื่อนไขที่การย้ายไม่ถูกกฎหมาย สำหรับการเคลื่อนไหวที่ผิดกฎหมาย - ป้องกันด้วย '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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.