मैं टचस्क्रीन के लिए jQuery UI 'draggable ()' div draggable कैसे बना सकता हूं?


112

मेरे पास एक jQuery UI है draggable()जो फ़ायरफ़ॉक्स और क्रोम में काम करता है। उपयोगकर्ता इंटरफ़ेस अवधारणा मूल रूप से "पोस्ट-इट" प्रकार आइटम बनाने के लिए क्लिक करता है।

मूल रूप से, मैं क्लिक 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);
});

और यहाँ वह कोड है जिसका उपयोग मैं नोट को "सेव" करने के लिए करता हूँ और इनपुट डिव को सिर्फ डिस्प्ले डिव में बदल देता हूँ:

$('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 के साथ गलत कर रहा हूं, या क्या क्रॉस-प्लेटफॉर्म / बैकवर्ड संगत ड्रैगेबल () तत्वों को करने के लिए बेहतर रूपरेखा हो सकती है टचस्क्रीन यूआई के लिए काम करते हैं।

यूआई घटकों को इस तरह से लिखने के बारे में अधिक सामान्य टिप्पणियां स्वागत के साथ-साथ होंगी।

धन्यवाद!


अद्यतन करें: मैं अपने jQuery यूआई draggable()कॉल पर बस इसे चेन करने में सक्षम था और iPad पर सही ड्रैगगैबिलिटी प्राप्त कर सकता था!

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

JQuery टच प्लगइन चाल किया!


1
मैं किसी चीज को लेकर उत्सुक हूं: क्या आप दो या तीन उंगलियों से डिव को चारों ओर खींच सकते हैं? मुझे पता है कि आपको कभी-कभी मोबाइल सफारी में एम्बेडेड सामग्री को स्क्रॉल करने के लिए कई उंगलियों का उपयोग करना पड़ता है, इसलिए यह "ड्रैगेबल" सामग्री के लिए समान हो सकता है।
वाल्टर मुंड

वाल्टर मुंड धन्यवाद! मैंने उंगलियों के किसी भी रूपांतर की कोशिश नहीं की है, मैं कोशिश करूँगा जब मैं इसे अपने हाथों में ले लूंगा!
आर्टलंग

1
दो या तीन उंगलियों ने वास्तव में "पूरे पृष्ठ" को अनजाने में स्क्रॉल करने से रोका, लेकिन ड्रैगेबल के लिए कोई बदलाव नहीं किया।
आर्टलुंग

दुर्भाग्य से यह तकनीक मेरे लिए काम नहीं करती थी। :(
ब्लास्टर

@ब्लास्टर आपको अन्य संभावित समाधानों के लिए कुछ अन्य उत्तरों पर ध्यान देने की आवश्यकता होगी
आर्टलैंग

जवाबों:


138

कई घंटे बर्बाद करने के बाद, मैं इस पार आया!

jQuery ui को स्पर्श-पंच

यह टैप ईवेंट को क्लिक ईवेंट के रूप में अनुवादित करता है। Jquery के बाद स्क्रिप्ट लोड करना याद रखें।

मुझे यह iPad और iPhone पर काम कर रहा है

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

2
यह समाधान बहुत अच्छा काम करता है, एक और जवाब मैं थक गया था छोटी गाड़ी थी और वास्तव में मदद नहीं की थी
म्यूज़फ़ैन

एक छोटी सी टिप: बहुत बढ़िया काम करती है, हालाँकि यदि ड्रैगेबल तत्व को लेयर के साथ कवर किया गया है जैसे कि मास्क के साथ एक छवि जिसके ऊपर कोई ड्रैग सक्रिय नहीं है, लेकिन समाधान ऐड-पॉइंटर-ईवेंट होगा: कोई नहीं; शीर्ष परतों पर।
एडलर

यह एक महान और सरल समाधान है, आप बस प्लगइन का उपयोग करते हैं और JQuery के ड्रैगेबल फ़ंक्शन के साथ काम करना जारी रखते हैं। बहुत बहुत धन्यवाद!
लगभग एक शुरुआत

यह ड्रैग करने योग्य के भीतर क्लिक करने योग्य वस्तुओं को रोकेगा।
अब्दुल सादिक यालसिन

61

सावधानी: यह उत्तर 2010 में लिखा गया था और प्रौद्योगिकी तेजी से आगे बढ़ी। अधिक हाल के समाधान के लिए, नीचे @ ctrl-alt-dileep का उत्तर देखें


अपनी आवश्यकताओं के आधार पर, आप jQuery टच प्लगइन की कोशिश कर सकते हैं ; आप यहां एक उदाहरण की कोशिश कर सकते हैं । यह मेरे iPhone पर खींचने के लिए ठीक काम करता है, जबकि jQuery UI Draggable नहीं करता है।

वैकल्पिक रूप से, आप इस प्लगइन की कोशिश कर सकते हैं , हालांकि इसके लिए आपको वास्तव में अपने ड्रैग करने योग्य फ़ंक्शन को लिखने की आवश्यकता हो सकती है।

एक विचार के रूप में: मानो या न मानो, हम इस बात की चर्चा कर रहे हैं कि टच डिवाइस जैसे कि iPad और iPhone दोनों का उपयोग करने वाली वेबसाइटों के लिए समस्याएँ पैदा कर रहा है: hover / onmouseover फ़ंक्शंस और ड्रैग करने योग्य सामग्री।

यदि आप इसके लिए अंतर्निहित समाधान में रुचि रखते हैं, तो यह तीन नई जावास्क्रिप्ट घटनाओं का उपयोग करना है; ontouchstart, ontouchmove और ontouchend। Apple ने वास्तव में उनके उपयोग के बारे में एक लेख लिखा है, जिसे आप यहां पा सकते हैं । एक सरल उदाहरण यहाँ पाया जा सकता है । इन घटनाओं का उपयोग उन दोनों प्लगइन्स में किया जाता है जिन्हें मैंने लिंक किया था।


2
सुपर कमाल! मुझे बस इतना करना था कि मैं .touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });अपने मौजूदा draggable()कॉल को चेन करूं और यह एक ट्रीट का काम करे! मैं अभी भी वर्कफ़्लो को सही तरीके से प्राप्त करने के लिए उन सभी घटनाओं को काम करना चाहता हूं, जो मैंने किया था, लेकिन jQuery के टच प्लगइन ने यह चाल चली!
आर्टलुंग

4
प्लगइन jquery.com पर उपलब्ध नहीं लगता है। आप अभी भी जावास्क्रिप्ट यहाँ पर प्रकट
अबाध

1
हेह, अब प्लगइन मेनिफेस्टेक्टिव एक्टिव.कॉम से भी गायब है। इसे आज़माइए
इयान हंटर

5
यह उत्तर अब मान्य नहीं है। 2012 के उत्तर के लिए नीचे @ ctrl-alt-dileep का उत्तर (jquery-ui-touch-punch) देखें
bjelli

1
@bjelli इसे इंगित करने के लिए धन्यवाद। मैंने एक चेतावनी के साथ अपना जवाब अपडेट किया है। :)
वॉनकोनराड

24

यह परियोजना सहायक होनी चाहिए - घटनाओं को क्लिक करने के लिए घटनाओं को मैप करने के लिए नक्शे को स्पर्श करता है जो कि jQuery UI को बिना किसी बदलाव के iPad और iPhone पर काम करने की अनुमति देता है। जेएस को किसी भी मौजूदा परियोजना में जोड़ें।

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 सॉर्टेबल Android या IOS के आधार पर स्पर्श उपकरणों पर काम नहीं करता है


3
यह बहुत अच्छा है वे इस 1.9 के साथ काम कर रहे हैं। एफडब्ल्यूआईडब्ल्यू, मुझे लगता है कि उस डेमो में कोड का संस्करण था, हालांकि इसमें कीड़े थे और यह अच्छी तरह से काम नहीं करता था। इस सवाल पर किसी ने अधिक सही संस्करण पोस्ट किया: stackoverflow.com/questions/6745098/… जो मेरे लिए बेहतर काम कर रहा है।
asgeo1

मैंने इसे संबोधित करने के लिए अपना उत्तर अपडेट कर दिया। मुझे मूल के साथ अपने उपयोग के मामले में कोई त्रुटि नहीं मिली है।
thatmiddleway

1
ड्रॉपबॉक्स लिंक नीचे है।
बेर्ग्रीनडीके


2

मैं कल इसी तरह की समस्या से जूझ रहा था। मेरे पास पहले से ही jQuery यूआई पंच के साथ मिलकर jQuery UI के ड्रैगेबल का उपयोग करके "काम करने वाला" समाधान था, जो अन्य उत्तरों में उल्लिखित हैं। हालाँकि, इस पद्धति का उपयोग करना मेरे लिए कुछ एंड्रॉइड डिवाइसों में अजीब कीड़े पैदा कर रहा था, और इसलिए मैंने एक छोटा jQuery प्लगइन लिखने का फैसला किया, जो नकली माउस घटनाओं का अनुकरण करने वाली विधि का उपयोग करने के बजाय स्पर्श घटनाओं का उपयोग करके HTML तत्वों को खींचने योग्य बना सकता है।

इसका परिणाम jQuery Draggable Touch है जो तत्वों को खींचने योग्य बनाने के लिए एक सरल jQuery प्लगइन है, जिसमें टच डिवाइसेस हैं क्योंकि यह टच इवेंट्स (जैसे टचस्टार्ट, टचमोव, टचेंड, आदि) का उपयोग करके मुख्य लक्ष्य है। यदि ब्राउज़र / डिवाइस स्पर्श घटनाओं का समर्थन नहीं करता है, तो इसमें अभी भी एक कमबैक है जो माउस ईवेंट का उपयोग करता है।


हाय हेमैन, यह अच्छा काम है। इसे शेयर करने के लिए धन्यवाद। यह jQuery के resizable के लिए भी काम करेंगे?
हरिस

1

आप jquery.pep.js का उपयोग करके देख सकते हैं :

jquery.pep.js एक हल्का jQuery प्लगइन है जो किसी भी DOM एलिमेंट को ड्रैग करने योग्य ऑब्जेक्ट में बदल देता है। यह ज्यादातर सभी ब्राउज़रों में काम करता है, पुराने से नए तक, स्पर्श से क्लिक तक। मैंने इसे एक ऐसी आवश्यकता की पूर्ति के लिए बनाया था जिसमें jQuery UI का ड्रैगगबल पूरा नहीं हो रहा था, क्योंकि यह स्पर्श उपकरणों (कुछ हैकरी के बिना) पर काम नहीं करता था।

वेबसाइट , GitHub लिंक


1
धन्यवाद @martynas, मैं इसे बाहर की जाँच करेंगे!
आर्टलंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.