2012-04-04 1 views
7

Я пытаюсь получить перетаскивание jQuery, чтобы хорошо работать с событиями iPad touch. Я нашел этот код в интернете:Обработка событий iPad touch для draggables/droppables (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(); 
} 

Это, кажется, работает нормально, если я придаю touchHandler к document touchstart/переместить/конец, но не родной трансфокации/прокрутка на IPad не допускается, поэтому я пытаясь просто привязать этот обработчик к перетаскиваемым самим себе.

Вопрос, который я вижу с этим, заключается в том, что по какой-то причине event.changeTouches всегда не определен, так как вы можете видеть в http://jsfiddle.net/myLj2/1/. Я не могу придумать, почему событие touch всегда будет иметь неопределенное свойство changeTouches, и из-за этого этот код не будет работать. Есть предположения?

ответ

9

Я понял это после обнаружения Does jQuery preserve touch events properties?.

Оказывается, что событие Jquery не скопирует changeTouches собственности, так что вы должны либо использовать originalEvent свойство JQuery или пропустить JQuery все вместе и связать с функцией как addEventListener

+0

Просто спасли мой день! –