터치 장치 용 자바 스크립트 드래그 앤 드롭 [닫기]


120

터치 장치에서 작동하는 드래그 앤 드롭 플러그인을 찾고 있습니다.

"droppable"요소를 허용 하는 jQuery UI 플러그인 과 유사한 기능을 원합니다 .

플러그인 jqtouch 드래그 지원,하지만 낙하.

여기에 드래그 &에만 아이폰 / 아이 패드를 지원하는 드롭입니다.

누구든지 Android / ios에서 작동하는 드래그 앤 드롭 플러그인의 방향을 알려줄 수 있나요?

... 또는 드롭 가능성을 위해 jqtouch 플러그인을 업데이트 할 수 있습니다. 이미 Andriod 및 IOS에서 실행됩니다.

감사!


1
진행 중이지만 어떤 장치가 지원하는지 모르겠습니다 :이 plugins.jquery.com/project/mobiledraganddrop ... jQuerymobile.com 라이브러리를 살펴 보셨습니까? 나는 또한이 중복 SO 질문을 발견했다 : stackoverflow.com/questions/3172100/…
iivel

감사. 예 mobiledraganddrop은 모바일 장치에서 클릭 앤 드롭 만 지원합니다. jQuerymobile.com에서 아무것도 찾을 수 없습니다. 다른 질문에는 제한된 소스 라이센스가있는 sencha.com/products/touch 를 참조하는 정답으로 이미 표시된 답변이 있습니다.
joe

모바일 및 데스크톱 브라우저에서 작동하는 브라우저가 궁금합니다.
Lime

답변:


258

마우스 이벤트를 필요한 터치로 변환하는 추가 라이브러리와 함께 드래그 앤 드롭에 Jquery UI를 사용할 수 있습니다. 제가 권장하는 라이브러리는 https://github.com/furf/jquery-ui-touch-punch 입니다. 이것은 Jquery UI에서 드래그 앤 드롭이 터치 장치에서 작동합니다.

또는 내가 사용중인이 코드를 사용할 수 있으며 마우스 이벤트를 터치로 변환하고 마법처럼 작동합니다.

function touchHandler(event) {
    var touch = event.changedTouches[0];

    var simulatedEvent = document.createEvent("MouseEvent");
        simulatedEvent.initMouseEvent({
        touchstart: "mousedown",
        touchmove: "mousemove",
        touchend: "mouseup"
    }[event.type], true, true, window, 1,
        touch.screenX, touch.screenY,
        touch.clientX, touch.clientY, false,
        false, false, false, 0, null);

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

function init() {
    document.addEventListener("touchstart", touchHandler, true);
    document.addEventListener("touchmove", touchHandler, true);
    document.addEventListener("touchend", touchHandler, true);
    document.addEventListener("touchcancel", touchHandler, true);
}

그리고 document.ready에서 init () 함수를 호출하십시오.

여기 에서 찾은 코드


11
감사합니다. 이제 Android 기기에서 드래그 할 수 있습니다. 그러나 클릭 이벤트는 더 이상 시작되지 않습니다. 그것을 고치는 방법에 대한 아이디어가 있습니까?
John Landheer 2011

9
참고 : 이벤트 리스너가 전체 문서에 대해 등록되었으므로이 솔루션은 내 Nexus S에서 스크롤링도 비활성화합니다.
Ethan Leroy

29
공유해 주셔서 감사합니다. 그러나 게시 한 코드의 원저자에게 크레딧을 제공해야합니다. ross.posterous.com/2008/08/19/iphone-touch-events-in-javascript
정의되지 않음

2
@JohnLandheer 드래그 가능한 개체에만 이벤트 리스너를 연결하여 문제를 해결했습니다.document.getElementById('draggableContainer').addEventListener(...
chiliNUT

1
터치 펀치는 훌륭합니다. '그냥 작동하는'것 중 하나입니다. 아아, 그것은 듀얼 터치를 지원하지 않습니다 ... 제가보고 싶습니다.
DA.

21

이것을 사용하고 '클릭'기능을 유지하려는 사람은 (John Landheer가 그의 의견에서 언급했듯이) 몇 가지 수정 만하면됩니다.

몇 가지 전역을 추가합니다.

var clickms = 100;
var lastTouchDown = -1;

그런 다음 원래의 switch 문을 다음과 같이 수정합니다.

var d = new Date();
switch(event.type)
{
    case "touchstart": type = "mousedown"; lastTouchDown = d.getTime(); break;
    case "touchmove": type="mousemove"; lastTouchDown = -1; break;        
    case "touchend": if(lastTouchDown > -1 && (d.getTime() - lastTouchDown) < clickms){lastTouchDown = -1; type="click"; break;} type="mouseup"; break;
    default: return;
}

취향에 따라 '클릭 수'를 조정할 수 있습니다. 기본적으로 클릭을 시뮬레이션하기 위해 '터치 스타트'와 '터치 엔드'를 빠르게 지켜 보는 것입니다.


@EZ Hart-클릭 이벤트를 활성화하기 위해 위의 코드에 코드를 넣을 위치를 알려주십시오 ???
Valay 2014

1
@ChakoDesai-답변을 작성한 이후 답변의 코드가 많이 편집되었습니다. stackoverflow.com/posts/6362527/revisions를 확인하고 2011 년 6 월 30 일의 코드를 살펴보십시오. 내 대답은 해당 버전을 기반으로 훨씬 더 의미가 있습니다.
EZ Hart

@EZ Hart-주어진 URL에서 코드를 업데이트했습니다. 그러나 때로는 click작동하고 때로는 작동하지 않는 이유 ???
Valay 2014

@ChakoDesai-코드를 보지 않고는 확신 할 수 없습니다. 그것에 대한 새로운 질문을 여는 것이 좋습니다.
EZ Hart

클릭 이벤트에서 위의 코드가 작동하도록하기위한 업데이트 된 답변은 다음에서 찾을 수 있습니다. stackoverflow.com/questions/28218888/…
Blunderfest

12

위의 코드에 감사드립니다! -몇 가지 옵션을 시도했는데 이것이 티켓이었습니다. 나는 preventDefault가 ipad에서 스크롤을 막고 있다는 문제가 있었다. 나는 지금 드래그 가능한 항목을 테스트하고 있으며 지금까지 훌륭하게 작동한다.

if (event.target.id == 'draggable_item' ) {
    event.preventDefault();
}

Windows Phone에서 이것을 테스트 했습니까? 아니면 iPhone 이외의 다른 것이 있습니까? 과거의 경험으로 볼 때 이것은 iPhone / iPads에서 완벽하게 작동하는 것처럼 보이지만 다른 장치, 특히 Windows Phone에서는 잘 작동하지 않습니다.
거의 초보자

10

gregpress answer 와 동일한 솔루션이 있었지만 드래그 가능한 항목은 ID 대신 클래스를 사용했습니다. 작동하는 것 같습니다.

var $target = $(event.target);  
if( $target.hasClass('draggable') ) {  
    event.preventDefault();  
}

4
단순히 다른 선택기를 사용했다는 사실은 별도의 답변이 아니라는 대신 @gregpress의 답변에 대해 주석을 달아야합니다.
bPratik

2
@bPratik은 대답이 제공하는 더 좋은 형식을 원하지 않는 한-전체 코드 예제를 제공했다는 사실은 별도의 대답을 보장합니다. 그래도 그의 대답에 연결하는 댓글을 남겼어야했는데 ...
drzaus

8

내가 아는 오래된 실 .......

@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


어떤 물건을 전달해야하나요 simulateTouchEvents(<object>, true);???
Valay 2014

예를 들면 : simulateTouchEvents ($ ( '# yourid;), true); 또는 SimulationTouchEvents (document.getElementById ( 'yourid'), true); 기타
Codebeat 2014

내 다른 질문 링크 를 봐주세요 ???
Valay 2014.11.17

사용 threedubmedia.com/code/event/drag 및 비활성화 X 또는 요소의 Y 이동. 이 기사의 코드를 사용하면 스크롤바를 '스크롤'할 수 있습니다. 그러나 휴대폰의 페이지에 이미 스크롤바가 있기 때문에이 작업을 원하는 이유를 알고 있어야합니다. 그것으로 무엇을하고 싶은지 이해하지 못합니다. 성공!
Codebeat 2014

드래그 앤 드롭 열을 추가하고 둘 다 스크롤해야합니다. 에서 touch이벤트를 켤 때 chrome테이블을 스크롤 할 수 없습니다. 모바일에서도 마찬가지입니다.
Valay 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.