Viejo hilo lo sé .......
El problema con la respuesta de @ryuutatsuo es que también bloquea cualquier entrada u otro elemento que tenga que reaccionar a los 'clics' (por ejemplo, entradas), así que escribí esta solución. Esta solución hizo posible utilizar cualquier biblioteca de arrastrar y soltar existente que se basa en eventos de mousedown, mousemove y mouseup en cualquier dispositivo táctil (o cumputer). Esta es también una solución para varios navegadores.
He probado en varios dispositivos y funciona rápido (en combinación con la función de arrastrar y soltar de ThreeDubMedia (ver también http://threedubmedia.com/code/event/drag )). Es una solución de jQuery, por lo que solo puede usarla con las bibliotecas de jQuery. He usado jQuery 1.5.1 porque algunas funciones más nuevas no funcionan correctamente con IE9 y superior (no probado con versiones más nuevas de jQuery).
Antes de agregar cualquier operación de arrastrar o soltar a un evento , primero debe llamar a esta función :
simulateTouchEvents(<object>);
También puede bloquear todos los componentes / elementos secundarios para la entrada o para acelerar el manejo de eventos utilizando la siguiente sintaxis:
simulateTouchEvents(<object>, true); // ignore events on childs
Aquí está el código que escribí. Usé algunos buenos trucos para acelerar la evaluación de las cosas (ver código).
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;
};
Qué hace: al principio, traduce eventos de un solo toque en eventos de mouse. Comprueba si un evento es causado por un elemento en / en el elemento que debe ser arrastrado. Si es un elemento de entrada como input, textarea, etc., omite la traducción, o si se le adjunta un evento de mouse estándar, también omitirá una traducción.
Resultado: todos los elementos de un elemento arrastrable siguen funcionando.
Feliz codificación, saludos, Erwin Haantjes