पुराना धागा मैं जानता हूं ......।
@Ryuutatsuo के उत्तर के साथ समस्या यह है कि यह किसी भी इनपुट या अन्य तत्व को ब्लॉक करता है जिसे 'क्लिक' पर प्रतिक्रिया करनी होती है (उदाहरण इनपुट के लिए), इसलिए मैंने यह समाधान लिखा है। इस समाधान ने किसी भी मौजूदा ड्रैग एंड ड्रॉप लाइब्रेरी का उपयोग करना संभव बनाया जो किसी भी टच डिवाइस (या cumputer) पर मूसडाउन, मूसमव और माउसअप घटनाओं पर आधारित है। यह एक क्रॉस-ब्राउज़र समाधान भी है।
मैंने कई उपकरणों पर परीक्षण किया है और यह तेजी से काम करता है (थ्रीडूबमीडिया के ड्रैग एंड ड्रॉप फीचर के साथ संयोजन में ( http://threedubmedia.com/code/event/drag ) भी देखें )। यह एक jQuery समाधान है, इसलिए आप इसे केवल jQuery के काम में उपयोग कर सकते हैं। मैंने इसके लिए jQuery 1.5.1 का उपयोग किया है क्योंकि कुछ नए फ़ंक्शन IE9 और इसके बाद के संस्करण के साथ ठीक से काम नहीं करते हैं (jQuery के नए संस्करणों के साथ परीक्षण नहीं किया गया है)।
इससे पहले कि आप किसी समारोह में कोई ड्रैग या ड्रॉप ऑपरेशन जोड़ें, आपको पहले इस फ़ंक्शन को कॉल करना होगा :
simulateTouchEvents(<object>);
आप इनपुट के लिए या निम्नलिखित सिंटैक्स का उपयोग करके इवेंट हैंडलिंग को गति देने के लिए सभी घटकों / बच्चों को भी ब्लॉक कर सकते हैं:
simulateTouchEvents(<object>, true); // ignore events on childs
यहाँ कोड मैंने लिखा है। मैंने चीजों के मूल्यांकन में तेजी लाने के लिए कुछ अच्छे ट्रिक्स का इस्तेमाल किया (कोड देखें)।
function simulateTouchEvents(oo,bIgnoreChilds)
{
if( !$(oo)[0] )
{ return false; }
if( !window.__touchTypes )
{
window.__touchTypes = {touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup'};
window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textarea':1,'select':1,'option':1};
}
$(oo).bind('touchstart touchmove touchend', function(ev)
{
var bSame = (ev.target == this);
if( bIgnoreChilds && !bSame )
{ return; }
var b = (!bSame && ev.target.__ajqmeclk), // Get if object is already tested or input type
e = ev.originalEvent;
if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] )
{ return; } //allow multi-touch gestures to work
var oEv = ( !bSame && typeof b != 'boolean')?$(ev.target).data('events'):false,
b = (!bSame)?(ev.target.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false;
if( b || window.__touchInputs[ev.target.tagName] )
{ return; } //allow default clicks to work (and on inputs)
// https://developer.mozilla.org/en/DOM/event.initMouseEvent for API
var touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent");
newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1,
touch.screenX, touch.screenY,
touch.clientX, touch.clientY, false,
false, false, false, 0, null);
touch.target.dispatchEvent(newEvent);
e.preventDefault();
ev.stopImmediatePropagation();
ev.stopPropagation();
ev.preventDefault();
});
return true;
};
यह क्या करता है: सबसे पहले, यह माउस घटनाओं में एकल स्पर्श घटनाओं का अनुवाद करता है। यह जाँचता है कि क्या कोई घटना किसी तत्व द्वारा / उस तत्व के कारण होती है, जिसे चारों ओर खींचा जाना चाहिए। यदि यह इनपुट, टेक्सारिया आदि जैसे इनपुट तत्व है, तो यह अनुवाद को छोड़ देता है, या यदि एक मानक माउस घटना इसके साथ जुड़ी हुई है, तो यह अनुवाद को छोड़ देगा।
परिणाम: एक ड्रैग करने योग्य तत्व का प्रत्येक तत्व अभी भी काम कर रहा है।
हैप्पी कोडिंग, अभिवादन, इरविन हैन्त्ज