Benang lama yang saya tahu .......
Masalah dengan jawaban @ryuutatsuo adalah bahwa ia juga memblokir input atau elemen lain yang harus bereaksi pada 'klik' (misalnya input), jadi saya menulis solusi ini. Solusi ini memungkinkan untuk menggunakan pustaka seret dan lepas yang ada yang didasarkan pada peristiwa mousedown, mousemove, dan mouseup pada perangkat sentuh apa pun (atau komputer). Ini juga merupakan solusi lintas-browser.
Saya telah mengujinya pada beberapa perangkat dan bekerja cepat (dikombinasikan dengan fitur drag and drop dari ThreeDubMedia (lihat juga http://threedubmedia.com/code/event/drag )). Ini adalah solusi jQuery sehingga Anda dapat menggunakannya hanya dengan jQuery libs. Saya telah menggunakan jQuery 1.5.1 untuk itu karena beberapa fungsi yang lebih baru tidak berfungsi dengan baik dengan IE9 dan di atasnya (tidak diuji dengan versi jQuery yang lebih baru).
Sebelum Anda menambahkan operasi seret atau lepas ke acara, Anda harus memanggil fungsi ini terlebih dahulu :
simulateTouchEvents(<object>);
Anda juga dapat memblokir semua komponen / turunan untuk input atau untuk mempercepat penanganan acara dengan menggunakan sintaks berikut:
simulateTouchEvents(<object>, true); // ignore events on childs
Ini kode yang saya tulis. Saya menggunakan beberapa trik bagus untuk mempercepat evaluasi sesuatu (lihat kode).
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;
};
Kegunaan: Awalnya, ini menerjemahkan peristiwa satu sentuhan menjadi peristiwa mouse. Ia memeriksa apakah suatu peristiwa disebabkan oleh elemen di / dalam elemen yang harus diseret. Jika itu adalah elemen input seperti input, textarea dll, itu melewatkan terjemahan, atau jika event mouse standar dilampirkan padanya itu juga akan melewatkan terjemahan.
Hasil: Setiap elemen pada elemen yang dapat diseret masih berfungsi.
Selamat membuat kode, salam, Erwin Haantjes