터치 스크린 용 jQuery UI 'draggable ()'div를 드래그 할 수있게하려면 어떻게해야합니까?


112

draggable()Firefox 및 Chrome에서 작동 하는 jQuery UI 가 있습니다. 사용자 인터페이스 개념은 기본적으로 클릭하여 "포스트잇"유형 항목을 생성하는 것입니다.

기본적으로 클릭 div#everything을 수신 하는 (100 % 높이 및 너비)를 클릭하거나 탭 하면 입력 텍스트 영역이 표시됩니다. 텍스트를 추가 한 다음 완료되면 저장합니다. 이 요소를 드래그 할 수 있습니다. 일반 브라우저에서 작동하지만 iPad에서 테스트 할 수있는 항목을 드래그 할 수 없습니다. 터치하여 선택하면 (약간 어두워 짐) 드래그 할 수 없습니다. 왼쪽이나 오른쪽으로 드래그하지 않습니다. 내가 할 수 위로 또는 아래로 드래그,하지만 난 개인을 끌어 아니에요 div내가 전체 웹 페이지를 드래그하고 있습니다.

클릭을 캡처하는 데 사용하는 코드는 다음과 같습니다.

$('#everything').bind('click', function(e){
    var elem = document.createElement('DIV');
    STATE.top = e.pageY;
    STATE.left = e.pageX;
    var e = $(elem).css({
        top: STATE.top,
        left: STATE.left
    }).html('<textarea></textarea>')
    .addClass('instance')
    .bind('click', function(event){
        return false;
    });
    $(this).append(e);
});

다음은 메모를 "저장"하고 입력 div를 디스플레이 div로 바꾸는 데 사용하는 코드입니다.

$('textarea').live('mouseleave', function(){
    var val = jQuery.trim($(this).val());
    STATE.content = val;
    if (val == '') {
        $(this).parent().remove();
    } else {
        var div  = $(this).parent();
        div.text(val).css({
            height: '30px'
        });
        STATE.height = 30;
        if ( div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight ) {
            while (div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight) {
                var h = div.height() + 10;
                STATE.height = h;
                div.css({
                    height: (h) + 'px'
                });     // element just got scrollbars
            }
        }
        STATE.guid = uniqueID()
        div.addClass('savedNote').attr('id', STATE.guid).draggable({
            stop: function() {
                var offset = $(this).offset();
                STATE.guid = $(this).attr('id');
                STATE.top = offset.top;
                STATE.left = offset.left;
                STATE.content = $(this).text();
                STATE.height = $(this).height();
                STATE.save();
            }
        });
        STATE.save();
        $(this).remove();
    }
});

저장된 메모 페이지를로드 할 때이 코드가 있습니다.

$('.savedNote').draggable({
    stop: function() {
        STATE.guid = $(this).attr('id');
        var offset = $(this).offset();
        STATE.top = offset.top;
        STATE.left = offset.left;
        STATE.content = $(this).text();
        STATE.height = $(this).height();
        STATE.save();
    }
});

STATE개체는 메모 저장을 처리합니다.

Onload, 이것은 전체 html 본문입니다.

<body> 
    <div id="everything"></div> 
<div class="instance savedNote" id="iddd1b0969-c634-8876-75a9-b274ff87186b" style="top:134px;left:715px;height:30px;">Whatever dude</div> 
<div class="instance savedNote" id="id8a129f06-7d0c-3cb3-9212-0f38a8445700" style="top:131px;left:347px;height:30px;">Appointment 11:45am</div> 
<div class="instance savedNote" id="ide92e3d13-afe8-79d7-bc03-818d4c7a471f" style="top:144px;left:65px;height:80px;">What do you think of a board where you can add writing as much as possible?</div> 
<div class="instance savedNote" id="idef7fe420-4c19-cfec-36b6-272f1e9b5df5" style="top:301px;left:534px;height:30px;">This was submitted</div> 
<div class="instance savedNote" id="id93b3b56f-5e23-1bd1-ddc1-9be41f1efb44" style="top:390px;left:217px;height:30px;">Hello world from iPad.</div> 

</body>

그래서, 제 질문은 정말입니다 : iPad에서 어떻게 더 잘 작동시킬 수 있습니까?

나는 jQuery UI를 설정하지 않았고, 이것이 내가 jQuery UI 또는 jQuery에서 잘못하고있는 일인지, 아니면 크로스 플랫폼 / 백 워드 호환 draggable () 요소를 수행하기위한 더 나은 프레임 워크가 있는지 궁금합니다. 터치 스크린 UI에서 작동합니다.

이와 같은 UI 구성 요소를 작성하는 방법에 대한 일반적인 의견도 환영합니다.

감사!


업데이트 : 나는 이것을 jQuery UI draggable()호출에 연결하고 iPad에서 올바른 드래그 가능성을 얻을 수있었습니다!

.touch({
    animate: false,
    sticky: false,
    dragx: true,
    dragy: true,
    rotate: false,
    resort: true,
    scale: false
});

jQuery를 터치 플러그인은 속임수를 썼는지!


1
궁금한 점이 있습니다. 두 손가락 또는 세 손가락으로 div를 드래그 할 수 있나요? 모바일 Safari에서 포함 된 콘텐츠를 스크롤하려면 여러 손가락을 사용해야하는 경우가 있으므로 "드래그 가능한"콘텐츠에 대해서도 동일 할 수 있습니다.
Walter Mundt

Walter Mundt 감사합니다! 나는 손가락의 변형을 시도하지 않았으며 손에 넣으면 시도 할 것입니다!
artlung

1
실제로 두세 손가락으로 "전체 페이지"가 ​​실수로 스크롤되는 것을 막았지만 드래그 가능한 항목은 변경하지 않았습니다.
artlung 2010 년

이 기술은 안타깝게도 저에게는 효과가없는 것 같습니다. :(
blaster 2011

@blaster 다른 가능한 솔루션에 대한 다른 답변을 살펴보아야합니다
artlung 2011-12-06

답변:


138

많은 시간을 허비 한 끝에 나는 이것을 발견했습니다!

jquery-ui-touch-punch

탭 이벤트를 클릭 이벤트로 변환합니다. jquery 후에 스크립트를로드해야합니다.

이 작업은 iPad와 iPhone에서 작동합니다.

$('#movable').draggable({containment: "parent"});

2
이 솔루션은 좋은 작품, 피곤 다른 응답 나는 버그이었다 정말 도움이되지 않았다
musefan

작은 팁 : 위의 마스크가있는 이미지처럼 드래그 가능한 요소가 레이어로 덮여 있으면 드래그가 활성화되지 않지만 해결책은 포인터 추가 이벤트가 될 것입니다. 상단 레이어에.
Adler 2014

이것은 훌륭하고 간단한 솔루션입니다. 플러그인을 사용하고 JQuery 드래그 가능 함수로 계속 작업하십시오. 감사합니다!
거의 초보자 인

이렇게하면 드래그 가능한 항목 내에서 클릭 가능한 항목이 방지됩니다.
Abdul Sadik Yalcin

61

주의 : 이 답변은 2010 년에 작성되었으며 기술은 빠르게 움직입니다. 최신 솔루션은 아래 @ ctrl-alt-dileep의 답변을 참조하십시오 .


필요에 따라 jQuery 터치 플러그인 을 사용해 볼 수 있습니다 . 여기 에서 예제를 시도해 볼 수 있습니다 . 내 iPhone에서 드래그하는 것은 잘 작동하지만 jQuery UI Draggable은 그렇지 않습니다.

또는 플러그인을 사용해 볼 수 있지만 실제로 드래그 가능한 함수를 작성해야 할 수도 있습니다.

참고로 : 믿거 나 말거나, iPad 및 iPhone과 같은 터치 장치가 : hover / onmouseover 기능과 드래그 가능한 콘텐츠를 사용하는 웹 사이트 모두에서 문제를 일으키는 방법에 대한 소문이 증가하고 있습니다.

이에 대한 기본 솔루션에 관심이 있다면 세 가지 새로운 JavaScript 이벤트를 사용하는 것입니다. ontouchstart, ontouchmove 및 ontouchend. Apple은 실제로 사용에 대한 기사를 작성했으며 여기에서 찾을 수 있습니다 . 여기 에서 간단한 예를 찾을 수 있습니다 . 이 이벤트는 내가 링크 한 두 플러그인 모두에서 사용됩니다.


2
대단해! 내가해야 할 일은 .touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });기존 draggable()통화 에 연결하는 것이었고 대우를 받았습니다! 워크 플로를 올바르게 처리하려면 여전히 처리하려는 모든 이벤트를 해결해야하지만 jQuery 터치 플러그인이 트릭을 수행했습니다!
artlung 2010 년

4
플러그인은 더 이상 jquery.com에서 사용할 수없는 것 같습니다. 당신은 여전히 ​​여기에서 자바 스크립트를 찾을 수 있습니다 manifestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli

1
이제 플러그인도 manifestinteractive.com에서 누락되었습니다. 이것을 시도하십시오 : plugins.jquery.com/files/jquery.touch.js.txt
Ian Hunter

5
이 답변은 더 이상 유효하지 않습니다. 2012 답변은 아래 @ ctrl-alt-dileep의 답변 (jquery-ui-touch-punch)을 참조하십시오
bjelli

1
@bjelli 이것을 지적 해 주셔서 감사합니다. 경고로 답변을 업데이트했습니다. :)
vonconrad


7

jQuery ui 1.9가이를 처리 해줄 것입니다. 다음은 사전 데모입니다.

https://dl.dropbox.com/u/3872624/lab/touch/index.html

jquery.mouse.ui.js를 꺼내서로드중인 jQuery ui 파일 아래에 붙이기 만하면됩니다. 정렬도 가능합니다.

이 코드는 저에게 잘 작동하지만 오류가 발생하면 jquery.mouse.ui.js의 업데이트 된 버전을 여기에서 찾을 수 있습니다.

Jquery-ui sortable은 Android 또는 IOS 기반 터치 장치에서 작동하지 않습니다.


3
이 1.9를 다루는 것이 좋습니다. FWIW, 데모의 코드 버전에 버그가 있지만 잘 작동하지 않는다는 것을 알았습니다. : 누군가가이 질문에 좀 더 올바른 버전 게시 stackoverflow.com/questions/6745098/... 나를 위해 더 노력하고 있습니다.
asgeo1

이 문제를 해결하기 위해 답변을 업데이트했습니다. 아직 원본 사용 사례에서 오류가 발생하지 않았습니다.
thatmiddleway

1
Dropbox 링크가 다운되었습니다.
BerggreenDK


2

나는 어제 비슷한 문제로 어려움을 겪었습니다. 다른 답변에서 언급 된 jQuery Touch Punch와 함께 jQuery UI의 드래그 가능을 사용하는 "작동하는"솔루션이 이미 있습니다. 그러나이 방법을 사용하면 일부 Android 장치에서 이상한 버그가 발생했기 때문에 가짜 마우스 이벤트를 에뮬레이트하는 방법을 사용하는 대신 터치 이벤트를 사용하여 HTML 요소를 드래그 할 수있는 작은 jQuery 플러그인을 작성하기로 결정했습니다.

그 결과 , 요소를 드래그 할 수있게 만드는 간단한 jQuery 플러그인 인 jQuery Draggable Touch 는 터치 이벤트 (예 : touchstart, touchmove, touchend 등)를 사용하여 터치 장치를 기본 대상으로합니다. 브라우저 / 장치가 터치 이벤트를 지원하지 않는 경우 마우스 이벤트를 사용하는 대체 기능이 있습니다.


안녕하세요 Heyman, 잘하셨습니다. 공유해 주셔서 감사합니다. 크기 조정이 가능한 jQuery에서도 작동합니까?
Haris 2013 년

1

jquery.pep.js 를 사용해 볼 수 있습니다 .

jquery.pep.js 는 DOM 요소를 드래그 가능한 객체로 변환하는 경량 jQuery 플러그인입니다. 터치에서 클릭까지 대부분의 모든 브라우저에서 작동합니다. 터치 장치에서 작동하지 않았기 때문에 jQuery UI의 드래그 가능이 충족되지 않는 요구 사항을 충족하기 위해 구축했습니다 (해커없이).

웹 사이트 , GitHub 링크


1
@martynas 감사합니다. 확인해 보겠습니다!
artlung 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.