2012-04-04 7 views
7

Ich versuche, jQuery drag/drop so einzurichten, dass es gut mit iPad-Touch-Ereignissen funktioniert. Ich fand diesen Code im Internet:Umgang mit iPad-Touch-Ereignissen für ziehbare/aussetzbare Dateien (undefined changedTouches)

function touchHandler(event) 
{ 
    var touches = event.changedTouches, 
     first = touches[0], 
     type = ""; 
    switch (event.type) 
    { 
     case "touchstart": type = "mousedown"; break; 
     case "touchmove": type = "mousemove"; break; 
     case "touchend": type = "mouseup"; break; 
     default: return; 
    } 

    //initMouseEvent(type, canBubble, cancelable, view, clickCount, 
    //   screenX, screenY, clientX, clientY, ctrlKey, 
    //   altKey, shiftKey, metaKey, button, relatedTarget); 

    var simulatedEvent = document.createEvent("MouseEvent"); 
    simulatedEvent.initMouseEvent(type, true, true, window, 1, 
           first.screenX, first.screenY, 
           first.clientX, first.clientY, false, 
           false, false, false, 0/*left*/, null); 

    first.target.dispatchEvent(simulatedEvent); 
    event.preventDefault(); 
} 

Es scheint gut zu funktionieren, wenn ich die touchHandler zum document Berührungsstart/move/Ende anhängen, aber dann keine native Zoomen/auf dem iPad Scrollen erlaubt ist, also bin ich versuchen, diesen Handler nur an die ziehbaren Dateien selbst anzuhängen.

Das Problem, das ich damit sehe, ist, dass event.changeTouches aus irgendeinem Grund immer undefiniert ist, wie Sie in http://jsfiddle.net/myLj2/1/ Zeuge sein können. Ich kann mir keinen Grund vorstellen, warum ein Berührungsereignis immer eine undefinierte changeTouches Eigenschaft hat und deshalb wird dieser Code nicht funktionieren. Irgendwelche Gedanken?

Antwort

9

Ich fand es heraus nach der Entdeckung Does jQuery preserve touch events properties?.

Es stellt sich heraus, dass die jQuery-Ereignis nicht über die changeTouches Eigenschaft kopiert, so müssen Sie also entweder originalEvent Eigenschaft jQuery verwenden oder jQuery überspringen alle zusammen und binden mit einer Funktion wie addEventListener

+0

gerade meinen Tag gerettet! –