ฉันจะสร้าง jQuery UI 'draggable ()' div draggable สำหรับหน้าจอสัมผัสได้อย่างไร


112

ฉันมี jQuery UI draggable()ที่ใช้งานได้ใน Firefox และ Chrome โดยพื้นฐานแล้วแนวคิดส่วนติดต่อผู้ใช้คือการคลิกเพื่อสร้างรายการประเภท "โพสต์อิท"

โดยทั่วไปฉันคลิกหรือแตะที่div#everything(สูงและกว้าง 100%) ที่รับฟังการคลิกและพื้นที่ข้อความที่ป้อนจะปรากฏขึ้น คุณเพิ่มข้อความจากนั้นเมื่อคุณทำเสร็จแล้วจะบันทึก คุณสามารถลากองค์ประกอบนี้ไปรอบ ๆ ใช้งานได้บนเบราว์เซอร์ปกติ แต่บน iPad ฉันสามารถทดสอบได้โดยไม่สามารถลากรายการไปมาได้ ถ้าฉันแตะเพื่อเลือก (มันจะหรี่ลงเล็กน้อย) ฉันจะลากมันไม่ได้ มันจะไม่ลากไปทางซ้ายหรือขวาเลย ฉันสามารถลากขึ้นหรือลงได้ แต่ฉันไม่ได้ลากทีละdivหน้าฉันกำลังลากทั้งหน้าเว็บ

นี่คือรหัสที่ฉันใช้เพื่อจับการคลิก:

$('#everything').bind('click', function(e){
    var elem = document.createElement('DIV');
    STATE.top = e.pageY;
    STATE.left = e.pageX;
    var e = $(elem).css({
        top: STATE.top,
        left: STATE.left
    }).html('<textarea></textarea>')
    .addClass('instance')
    .bind('click', function(event){
        return false;
    });
    $(this).append(e);
});

และนี่คือรหัสที่ฉันใช้ในการ "บันทึก" โน้ตและเปลี่ยนอินพุต div ให้เป็น div ที่แสดง:

$('textarea').live('mouseleave', function(){
    var val = jQuery.trim($(this).val());
    STATE.content = val;
    if (val == '') {
        $(this).parent().remove();
    } else {
        var div  = $(this).parent();
        div.text(val).css({
            height: '30px'
        });
        STATE.height = 30;
        if ( div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight ) {
            while (div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight) {
                var h = div.height() + 10;
                STATE.height = h;
                div.css({
                    height: (h) + 'px'
                });     // element just got scrollbars
            }
        }
        STATE.guid = uniqueID()
        div.addClass('savedNote').attr('id', STATE.guid).draggable({
            stop: function() {
                var offset = $(this).offset();
                STATE.guid = $(this).attr('id');
                STATE.top = offset.top;
                STATE.left = offset.left;
                STATE.content = $(this).text();
                STATE.height = $(this).height();
                STATE.save();
            }
        });
        STATE.save();
        $(this).remove();
    }
});

และฉันมีรหัสนี้เมื่อฉันโหลดหน้าสำหรับบันทึกที่บันทึกไว้:

$('.savedNote').draggable({
    stop: function() {
        STATE.guid = $(this).attr('id');
        var offset = $(this).offset();
        STATE.top = offset.top;
        STATE.left = offset.left;
        STATE.content = $(this).text();
        STATE.height = $(this).height();
        STATE.save();
    }
});

STATEวัตถุของฉันจัดการบันทึกโน้ต

Onload นี่คือเนื้อหา html ทั้งหมด:

<body> 
    <div id="everything"></div> 
<div class="instance savedNote" id="iddd1b0969-c634-8876-75a9-b274ff87186b" style="top:134px;left:715px;height:30px;">Whatever dude</div> 
<div class="instance savedNote" id="id8a129f06-7d0c-3cb3-9212-0f38a8445700" style="top:131px;left:347px;height:30px;">Appointment 11:45am</div> 
<div class="instance savedNote" id="ide92e3d13-afe8-79d7-bc03-818d4c7a471f" style="top:144px;left:65px;height:80px;">What do you think of a board where you can add writing as much as possible?</div> 
<div class="instance savedNote" id="idef7fe420-4c19-cfec-36b6-272f1e9b5df5" style="top:301px;left:534px;height:30px;">This was submitted</div> 
<div class="instance savedNote" id="id93b3b56f-5e23-1bd1-ddc1-9be41f1efb44" style="top:390px;left:217px;height:30px;">Hello world from iPad.</div> 

</body>

คำถามของฉันคือจริงๆฉันจะทำให้งานนี้ดีขึ้นบน iPad ได้อย่างไร

ฉันไม่ได้ตั้งค่าบน jQuery UI ฉันสงสัยว่านี่เป็นสิ่งที่ฉันทำผิดกับ jQuery UI หรือ jQuery หรืออาจมีกรอบที่ดีกว่าสำหรับการทำองค์ประกอบที่ลากข้ามได้ข้ามแพลตฟอร์ม / ย้อนกลับ () ที่จะ ทำงานกับ UI ของหน้าจอสัมผัส

ความคิดเห็นทั่วไปเพิ่มเติมเกี่ยวกับวิธีการเขียนส่วนประกอบ UI เช่นนี้ก็ยินดีต้อนรับเช่นกัน

ขอบคุณ!


อัปเดต: ฉันสามารถdraggable()เชื่อมโยงสิ่งนี้เข้ากับการโทรjQuery UI ของฉันและรับการลากที่ถูกต้องบน iPad!

.touch({
    animate: false,
    sticky: false,
    dragx: true,
    dragy: true,
    rotate: false,
    resort: true,
    scale: false
});

ปลั๊กอิน jQuery สัมผัสได้เคล็ดลับ!


1
ฉันสงสัยเกี่ยวกับบางสิ่ง: คุณสามารถลาก div ไปรอบ ๆ ด้วยสองหรือสามนิ้วได้ไหม ฉันรู้ว่าบางครั้งคุณต้องใช้หลายนิ้วเพื่อเลื่อนเนื้อหาที่ฝังใน Safari บนมือถือดังนั้นเนื้อหาที่ "ลากได้" อาจจะเหมือนกัน
Walter Mundt

ขอบคุณ Walter Mundt! ฉันยังไม่ได้ลองใช้นิ้วรูปแบบต่างๆฉันจะลองเมื่อได้มาในมือ!
artlung

1
สองหรือสามนิ้วจริง ๆ แล้วไม่ให้เลื่อน "ทั้งหน้า" โดยไม่ได้ตั้งใจ แต่ไม่ได้ทำการเปลี่ยนแปลงสำหรับการลาก
artlung

เทคนิคนี้ดูเหมือนจะไม่ได้ผลสำหรับฉัน :(
บลาสเตอร์

@blaster คุณจะต้องดูคำตอบอื่น ๆ เพื่อหาคำตอบอื่น ๆ ที่เป็นไปได้
artlung

คำตอบ:


138

หลังจากเสียเวลาไปหลายชั่วโมงฉันก็เจอสิ่งนี้!

jQuery UI-สัมผัสหมัด

แปลเหตุการณ์การแตะเป็นเหตุการณ์คลิก อย่าลืมโหลดสคริปต์หลัง jquery

ฉันทำให้สิ่งนี้ใช้ได้กับ iPad และ iPhone

$('#movable').draggable({containment: "parent"});

2
วิธีนี้ใช้งานได้ดีคำตอบอื่นที่ฉันเหนื่อยคือรถและไม่ได้ช่วยจริงๆ
musefan

เคล็ดลับเล็ก ๆ น้อย ๆ : ใช้งานได้ดีแม้ว่าองค์ประกอบที่ลากได้ซึ่งปกคลุมด้วยเลเยอร์เช่นรูปภาพที่มีหน้ากากด้านบนจะไม่มีการเปิดใช้งานการลาก แต่วิธีแก้ปัญหาจะเป็นการเพิ่มตัวชี้เหตุการณ์: ไม่มี; ที่ชั้นบนสุด
Adler

นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมและเรียบง่ายคุณเพียงแค่ใช้ปลั๊กอินและทำงานกับฟังก์ชันลากได้ของ JQuery ต่อไป สมบูรณ์แบบขอบคุณ!
เกือบจะเป็นมือใหม่

วิธีนี้จะป้องกันไม่ให้รายการที่คลิกได้ภายในการลากได้
Abdul Sadik Yalcin

61

ข้อควรระวัง:คำตอบนี้เขียนขึ้นในปี 2010 และเทคโนโลยีก้าวไปอย่างรวดเร็ว สำหรับการแก้ปัญหาที่ผ่านมาเพิ่มเติมให้ดู@ คำตอบ Ctrl-Alt-Dileep ด้านล่าง


ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการลองใช้ปลั๊กอิน jQuery touch ; คุณสามารถลองตัวอย่างที่นี่ ใช้งานได้ดีในการลากบน iPhone ของฉันในขณะที่ jQuery UI Draggable ไม่ได้

หรือคุณสามารถลองใช้ปลั๊กอินนี้ได้แต่อาจทำให้คุณต้องเขียนฟังก์ชันลากได้ของคุณเอง

ในฐานะที่เป็นข้อคิดเห็น: เชื่อหรือไม่ว่าเราได้ยินข่าวลือที่เพิ่มมากขึ้นเกี่ยวกับการที่อุปกรณ์ระบบสัมผัสเช่น iPad และ iPhone ก่อให้เกิดปัญหากับทั้งสองเว็บไซต์ที่ใช้: ฟังก์ชั่นวางเมาส์ / เปิดเมาส์โอเวอร์และเนื้อหาที่ลากได้

หากคุณสนใจวิธีแก้ปัญหานี้คุณจะต้องใช้เหตุการณ์ JavaScript ใหม่สามเหตุการณ์ ontouchstart, ontouchmove และ ontouchend แอปเปิ้ลจริงได้เขียนบทความเกี่ยวกับการใช้ของพวกเขาที่คุณสามารถหาที่นี่ ตัวอย่างที่ง่ายสามารถพบได้ที่นี่ เหตุการณ์เหล่านี้ใช้ในปลั๊กอินทั้งสองที่ฉันเชื่อมโยง


2
สุดยอดมาก! สิ่งที่ฉันต้องทำคือเชื่อมต่อกับ.touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });การdraggable()โทรที่มีอยู่ของฉันและมันก็ใช้ได้ผล! ฉันยังคงต้องจัดการกับเหตุการณ์ทั้งหมดที่ฉันต้องการจัดการเพื่อให้เวิร์กโฟลว์ถูกต้อง แต่ปลั๊กอิน jQuery touch ทำเคล็ดลับได้!
artlung

4
ดูเหมือนว่าปลั๊กอินจะไม่มีให้ใช้งานบน jquery.com อีกต่อไป คุณยังสามารถหา javascript ได้ที่นี่manifestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli

1
เฮ้ตอนนี้ปลั๊กอินหายไปจาก manifestinteractive.com ด้วย ลองสิ่งนี้: plugins.jquery.com/files/jquery.touch.js.txt
Ian Hunter

5
คำตอบนี้ใช้ไม่ได้อีกต่อไป ดูคำตอบของ @ ctrl-alt-dileep ด้านล่าง (jquery-ui-touch-punch) สำหรับคำตอบในปี 2012
bjelli

1
@bjelli ขอบคุณที่ชี้ให้เห็น ฉันได้อัปเดตคำตอบพร้อมคำเตือนแล้ว :)
vonconrad

24

โครงการนี้น่าจะมีประโยชน์ - แมปเหตุการณ์การสัมผัสเพื่อคลิกเหตุการณ์ในลักษณะที่อนุญาตให้ jQuery UI ทำงานบน iPad และ iPhone โดยไม่มีการเปลี่ยนแปลงใด ๆ เพียงเพิ่ม JS ลงในโปรเจ็กต์ที่มีอยู่

http://code.google.com/p/jquery-ui-for-ipad-and-iphone/


7

jQuery ui 1.9 จะดูแลสิ่งนี้ให้คุณ นี่คือการสาธิตก่อนหน้านี้:

https://dl.dropbox.com/u/3872624/lab/touch/index.html

เพียงแค่หยิบ jquery.mouse.ui.js ออกมาติดไว้ใต้ไฟล์ jQuery ui ที่คุณกำลังโหลดและนั่นคือทั้งหมดที่คุณควรทำ! ใช้งานได้สำหรับการจัดเรียงเช่นกัน

รหัสนี้ใช้งานได้ดีสำหรับฉัน แต่หากคุณได้รับข้อผิดพลาดคุณสามารถพบ jquery.mouse.ui.js เวอร์ชันอัปเดตได้ที่นี่:

jquery-ui sortable ไม่ทำงานบนอุปกรณ์ระบบสัมผัสที่ใช้ Android หรือ IOS


3
นี่เป็นเรื่องที่ดีที่พวกเขารับมือกับ 1.9 นี้ FWIW ฉันพบว่าเวอร์ชันของโค้ดในการสาธิตนั้นมีข้อบกพร่องอยู่และทำงานได้ไม่ดี มีคนโพสต์เวอร์ชันที่ถูกต้องมากขึ้นสำหรับคำถามนี้: stackoverflow.com/questions/6745098/…ซึ่งทำงานได้ดีกว่าสำหรับฉัน
asgeo1

ฉันอัปเดตคำตอบเพื่อแก้ไขปัญหานี้ ฉันยังไม่พบข้อผิดพลาดใด ๆ ในกรณีการใช้งานของฉันกับต้นฉบับเลย
thatmiddleway

1
ลิงก์ Dropbox ไม่ทำงาน
BerggreenDK


2

ฉันกำลังต่อสู้กับปัญหาที่คล้ายกันเมื่อวานนี้ ฉันมีโซลูชัน "ใช้งานได้" อยู่แล้วโดยใช้การลากของ jQuery UI ร่วมกับ jQuery Touch Punch ซึ่งกล่าวถึงในคำตอบอื่น ๆ อย่างไรก็ตามการใช้วิธีนี้ทำให้เกิดข้อบกพร่องแปลก ๆ ในอุปกรณ์ Android บางรุ่นสำหรับฉันดังนั้นฉันจึงตัดสินใจเขียนปลั๊กอิน jQuery ขนาดเล็กที่สามารถทำให้องค์ประกอบ HTML ลากได้โดยใช้เหตุการณ์การสัมผัสแทนที่จะใช้วิธีที่เลียนแบบเหตุการณ์เมาส์ปลอม

ผลลัพธ์ของสิ่งนี้คือjQuery Draggable Touchซึ่งเป็นปลั๊กอิน jQuery ที่เรียบง่ายสำหรับการสร้างองค์ประกอบที่ลากได้ซึ่งมีอุปกรณ์สัมผัสเป็นเป้าหมายหลักโดยใช้เหตุการณ์การสัมผัส (เช่น touchstart, touchmove, touchend ฯลฯ ) ยังคงมีทางเลือกที่ใช้เหตุการณ์เมาส์หากเบราว์เซอร์ / อุปกรณ์ไม่รองรับเหตุการณ์การสัมผัส


สวัสดีเฮย์แมนเยี่ยมมาก ขอบคุณสำหรับการแบ่งปัน จะใช้กับ jQuery ปรับขนาดได้ด้วยหรือไม่?
Haris

1

คุณสามารถลองใช้jquery.pep.js :

jquery.pep.jsเป็นปลั๊กอิน jQuery ที่มีน้ำหนักเบาซึ่งจะเปลี่ยนองค์ประกอบ DOM ให้เป็นวัตถุที่ลากได้ ใช้งานได้กับเบราว์เซอร์ส่วนใหญ่ตั้งแต่รุ่นเก่าไปจนถึงรุ่นใหม่จากการสัมผัสเพื่อคลิก ฉันสร้างขึ้นเพื่อตอบสนองความต้องการที่ไม่สามารถลากได้ของ jQuery UI เนื่องจากไม่สามารถใช้งานได้บนอุปกรณ์สัมผัส (หากไม่มีแฮ็กเกอร์)

เว็บไซต์ , การเชื่อมโยง GitHub


1
ขอบคุณ @martynas ฉันจะลองดู!
artlung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.