পুরানো থ্রেড আমি জানি .......
@Ryuutatsuo এর উত্তরে সমস্যা হ'ল এটি 'ইনপুটস' (উদাহরণস্বরূপ ইনপুট) -এ প্রতিক্রিয়া দেখাতে পারে এমন কোনও ইনপুট বা অন্যান্য উপাদানকেও ব্লক করে, তাই আমি এই সমাধানটি লিখেছি। এই সমাধানটি কোনও স্পর্শ ডিভাইসে (বা বৈদ্যুতিন) মউসডাউন, মাউসমাভ এবং মাউসআপ ইভেন্টের উপর ভিত্তি করে বিদ্যমান যে কোনও ড্রাগ এবং ড্রপ লাইব্রেরি ব্যবহার করা সম্ভব করেছে। এটি একটি ক্রস-ব্রাউজার সমাধানও।
আমি বেশ কয়েকটি ডিভাইসে পরীক্ষা করেছি এবং এটি দ্রুত কাজ করে (থ্রিডবমিডিয়া-এর ড্রাগ এবং ড্রপ বৈশিষ্ট্যের সংমিশ্রণে (এছাড়াও http://thribubmedia.com/code/event/drag দেখুন ))। এটি একটি jQuery সমাধান যাতে আপনি এটি কেবল jQuery libs দিয়ে ব্যবহার করতে পারেন। আমি এর জন্য jQuery 1.5.1 ব্যবহার করেছি কারণ কিছু নতুন ফাংশন আইই 9 এবং এর উপরে (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;
};
এটি কী করে: প্রথমদিকে, এটি একক স্পর্শ ইভেন্টগুলিকে মাউসের ইভেন্টগুলিতে অনুবাদ করে। এটি তদন্ত করে যে কোনও ইভেন্ট এলিমেন্টে / এ উপাদানটিতে আক্রান্ত হয়েছে কিনা তাকে অবশ্যই প্রায় টেনে আনতে হবে। যদি এটি কোনও ইনপুট উপাদান যেমন ইনপুট, টেক্সারিয়া ইত্যাদি হয় তবে এটি অনুবাদটি এড়িয়ে যায়, বা কোনও মানদণ্ডের মাউস ইভেন্টের সাথে এটি সংযুক্ত থাকলে এটি একটি অনুবাদও এড়িয়ে যাবে।
ফলাফল: টেনে নেওয়ার যোগ্য উপাদানগুলির প্রতিটি উপাদান এখনও কাজ করছে।
শুভ কোডিং, শুভেচ্ছা, এরউইন হান্টজেস