내가 아는 오래된 실 .......
@ryuutatsuo의 답변에 대한 문제는 '클릭'(예 : 입력)에 반응해야하는 입력 또는 기타 요소도 차단한다는 것이므로이 솔루션을 작성했습니다. 이 솔루션을 통해 모든 터치 장치 (또는 컴퓨터)에서 mousedown, mousemove 및 mouseup 이벤트를 기반으로하는 기존의 드래그 앤 드롭 라이브러리를 사용할 수 있습니다. 이것은 또한 브라우저 간 솔루션입니다.
여러 장치에서 테스트 한 결과 빠르게 작동합니다 (ThreeDubMedia의 드래그 앤 드롭 기능과 함께 사용됩니다 ( http://threedubmedia.com/code/event/drag 참조).). jQuery 솔루션이므로 jQuery libs에서만 사용할 수 있습니다. 내가 사용하고 jQuery를 1.5.1을 몇 가지 있기 때문에 그것을 위해 새로운 기능을 위 IE9에서 제대로 작동하지 않습니다 (jQuery를 최신 버전으로 테스트하지).
이벤트에 끌어서 놓기 작업을 추가 하기 전에 먼저이 함수를 호출해야합니다 .
simulateTouchEvents(<object>);
또한 다음 구문을 사용하여 입력을 위해 모든 구성 요소 / 하위 항목을 차단하거나 이벤트 처리 속도를 높일 수 있습니다.
simulateTouchEvents(<object>, true); // ignore events on childs
내가 작성한 코드는 다음과 같습니다. 평가 속도를 높이기 위해 멋진 트릭을 사용했습니다 (코드 참조).
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;
};
기능 : 처음에는 단일 터치 이벤트를 마우스 이벤트로 변환합니다. 드래그해야하는 요소 위 / 안의 요소로 인해 이벤트가 발생했는지 확인합니다. input, textarea 등과 같은 입력 요소 인 경우 번역을 건너 뛰거나 표준 마우스 이벤트가 첨부 된 경우 번역도 건너 뜁니다.
결과 : 드래그 가능한 요소의 모든 요소가 계속 작동합니다.
즐거운 코딩, greetz, Erwin Haantjes