Alter Thread, den ich kenne .......
Das Problem mit der Antwort von @ryuutatsuo ist, dass es auch alle Eingaben oder andere Elemente blockiert, die auf 'Klicks' reagieren müssen (zum Beispiel Eingaben), also habe ich diese Lösung geschrieben. Diese Lösung ermöglichte die Verwendung jeder vorhandenen Drag & Drop-Bibliothek, die auf Mousedown-, Mousemove- und Mouseup-Ereignissen auf jedem Touch-Gerät (oder Cumputer) basiert. Dies ist auch eine browserübergreifende Lösung.
Ich habe auf mehreren Geräten getestet und es funktioniert schnell (in Kombination mit der Drag & Drop-Funktion von ThreeDubMedia (siehe auch http://threedubmedia.com/code/event/drag )). Da es sich um eine jQuery-Lösung handelt, können Sie sie nur mit jQuery-Bibliotheken verwenden. Ich habe jQuery 1.5.1 dafür verwendet, da einige neuere Funktionen mit IE9 und höher nicht ordnungsgemäß funktionieren (nicht mit neueren Versionen von jQuery getestet).
Bevor Sie einem Ereignis eine Drag & Drop- Operation hinzufügen , müssen Sie zuerst diese Funktion aufrufen :
simulateTouchEvents(<object>);
Sie können auch alle Komponenten / untergeordneten Elemente für die Eingabe blockieren oder die Ereignisbehandlung beschleunigen, indem Sie die folgende Syntax verwenden:
simulateTouchEvents(<object>, true); // ignore events on childs
Hier ist der Code, den ich geschrieben habe. Ich habe ein paar nette Tricks benutzt, um die Bewertung zu beschleunigen (siehe Code).
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;
};
Was es tut: Zuerst übersetzt es einzelne Berührungsereignisse in Mausereignisse. Es wird geprüft, ob ein Ereignis durch ein Element auf / in dem Element verursacht wird, das herumgezogen werden muss. Wenn es sich um ein Eingabeelement wie Eingabe, Textbereich usw. handelt, wird die Übersetzung übersprungen, oder wenn ein Standard-Mausereignis daran angehängt ist, wird auch eine Übersetzung übersprungen.
Ergebnis: Jedes Element in einem ziehbaren Element funktioniert noch.
Viel Spaß beim Codieren, Greetz, Erwin Haantjes