iPad 용 Safari에서 jQuery를 사용하여 터치 이벤트를 인식하려면 어떻게해야합니까? 가능합니까?


192

jQuery를 사용하여 iPad의 Safari 브라우저에서 터치 이벤트를 인식 할 수 있습니까?

웹 응용 프로그램에서 mouseOver 및 mouseOut 이벤트를 사용했습니다. mouseOut 및 mouseMove와 같은 이벤트가 없기 때문에 iPad의 Safari 브라우저와 유사한 이벤트가 있습니까?

답변:


240

핵심 jQuery에는 터치 이벤트에 특별한 것이 없지만 다음 이벤트를 사용하여 쉽게 자신의 것을 만들 수 있습니다.

  • 터치 스타트
  • 터치
  • 터치
  • 터치 취소

예를 들어 touchmove

document.addEventListener('touchmove', function(e) {
    e.preventDefault();
    var touch = e.touches[0];
    alert(touch.pageX + " - " + touch.pageY);
}, false);

이것은 대부분의 WebKit 기반 브라우저 (Android 포함)에서 작동합니다.

여기 좋은 문서가 있습니다.


2
고마워 데이비드, 나는 그것이 작동한다고 생각하지만 e.touches [0]는 무엇인가? 인수 "e"를 자세히 설명 할 수 있습니까?
Abhishek B.

7
e는 핸들러로 자동 전달되는 이벤트 오브젝트입니다. 사파리 브라우저 (및 안드로이드도)의 경우 이제 사용자가 화면에서 수행 한 모든 터치 배열을 포함합니다. 터치마다 고유 한 속성이 있습니다 (예 : x, y 좌표)
David Pean

1
-__-에서 이벤트를 트리거 할 요소를 찾는 방법은 무엇입니까?
Muhammad Umer

정답은 Timothy Perez가 만든 것이며,이 답변은 업데이트되지 않습니다.
EPurpl3

149

jQuery 1.7 이상을 사용하는 경우 다른 모든 답변보다 훨씬 간단합니다.

$('#whatever').on({ 'touchstart' : function(){ /* do something... */ } });

1
예, Timothy, 프로젝트를 시작할 때 1.7 이상 버전을 사용하지 않았습니다. 나는 지금 jquery 1.7 이상을 사용하고 있습니다. 좋은 제안 및 답변 주셔서 감사합니다. :)
Abhishek B.

7
이것은 잘 작동합니다. 같은 작업을 수행하려면 클릭 및 터치 스타트가 필요했으며 다음과 같이 객체가 아닌 구문에 $('#whatever').on('touchstart click', function(){ /* do something... */ });
익숙

1
내가 갈 때 $('#whatever').on({ 'touchstart' : function(ev){}});, ev터치 (터치, targetTouches 또는 changedTouches)에 대한 정보가하지 않는 것
문어

8
@Octopus : 아래에 터치 정보가 ev.originalEvent있습니다.
Peter Bloomfield

1
물론 @edonbajrami입니다. 문서를 확인하고 "위임 된 이벤트"를 찾으십시오. $ ( "# 새 요소를 모니터 할 요소") .on ( "eventX", "#element", function (event) {/ * whatever * /});
honk31

24

가장 간단한 방법은 Hammer.js와 같은 멀티 터치 JavaScript 라이브러리 를 사용하는 것입니다 . 그런 다음 다음과 같은 코드를 작성할 수 있습니다.

canvas
    .hammer({prevent_default: true})
    .bind('doubletap', function(e) { // And double click
        // Zoom-in
    })
    .bind('dragstart', function(e) { // And mousedown
        // Get ready to drag
    })
    .bind('drag', function(e) { // And mousemove when mousedown
        // Pan the image
    })
    .bind('dragend', function(e) { // And mouseup
        // Finish the drag
    });

그리고 당신은 계속 갈 수 있습니다. 탭, 더블 탭, 스 와이프, 홀드, 변형 (즉, 핀치) 및 드래그를 지원합니다. 동일한 마우스 동작이 발생하면 터치 이벤트도 시작되므로 두 개의 이벤트 핸들러 세트를 작성할 필요가 없습니다. 아시다시피 jQueryish 방식으로 작성하려면 jQuery 플러그인이 필요합니다.


29
은 "간단한"솔루션은 결코 더 추가 라이브러리가 복잡 문제 만들기 포함하지
문어

13
@Octopus 가장 간단한 해결책은 크로스 브라우저 두통을 제거하는 hammer.js를 사용하는 것입니다. 익숙한 영역에 있도록 jQuery 확장을 사용하십시오. 나에게는 너무 복잡해 보이지 않습니다.
trusktr

1
"가장 단순한"솔루션은 사람들이 가장 많이 사용하는 솔루션 인 경우가 많습니다. 무엇을 하든지 Microsoft Surface와 같은 터치와 마우스를 모두 지원하는 장치에서 솔루션이 작동하는지 확인하는 것이 좋습니다.
Simon_Weaver

1
@Octopus : "당신이 가진 모든 것이 망치 [sic] ... 모든 것이 못처럼 보입니다":)
Gone Coding

해머 타임입니다! 이 라이브러리를 공유해 주셔서 감사합니다. 내 응용 프로그램에 설치하고 실행하기 쉬웠습니다! 이벤트 핸들러가 다르기 때문에 설정하는 데 1 초가 걸렸지 만 간단한 console.log (event)가 필요한 것을 알려줍니다. 감사!
Andy

24

터치 시작 또는 터치 엔드 만 사용하는 것은 좋은 해결책이 아닙니다. 페이지를 스크롤하면 장치가 해당 페이지를 터치 또는 탭으로 감지하기 때문입니다. 탭과 클릭 이벤트를 동시에 감지하는 가장 좋은 방법은 화면을 움직이지 않는 터치 이벤트 만 감지하는 것입니다 (스크롤). 이를 위해서는 애플리케이션에 다음 코드를 추가하십시오.

$(document).on('touchstart', function() {
    detectTap = true; // Detects all touch events
});
$(document).on('touchmove', function() {
    detectTap = false; // Excludes the scroll events from touch events
});
$(document).on('click touchend', function(event) {
    if (event.type == "click") detectTap = true; // Detects click events
       if (detectTap){
          // Here you can write the function or codes you want to execute on tap

       }
 });

나는 그것을 테스트했으며 iPad와 iPhone에서 잘 작동합니다. 탭을 감지하여 탭과 터치 스크롤을 쉽게 구분할 수 있습니다.


2
이 솔루션은 내가 찾은 가장 직접적인 것으로 보이며 iOS에서 훌륭하게 작동하는 것 같습니다.
Joshua Lawrence Austill

jquery mobile을 먼저 사용했지만 다른 기능을 방해했습니다. 나는 이것을 지금 사용하고 있으며 완벽하게 작동합니다. 지금까지 문제가 없습니다.
Anurag Priyadarshi

18

당신은 사용할 수 있습니다 ) (CSTE 연구진은 여러 이벤트 화면 예에 터치 한 후 테스트를 캡처 :

$('#selector')
.on('touchstart mousedown', function(e){
  e.preventDefault();
  var touch = e.touches[0];
  if(touch){
    // Do some stuff
  }
  else {
    // Do some other stuff
  }
});

것을 제외하고는 .bind사용되지 않습니다. 당신이 사용해야합니다.on
jcuenod

15

jQuery Core에는 특별한 것이 없지만 jQuery Mobile Events 페이지에서 다양한 터치 이벤트에 대해 읽을 수 있으며 iOS 장치 이외의 다른 기기에서도 작동합니다.

그들은:

  • 꼭지
  • 꼭지점
  • 강타
  • 왼쪽으로 밀으시오
  • 스 와이프

또한 스크롤 이벤트 (모바일 장치의 터치 기반) 중에 iOS 장치는 스크롤하는 동안 DOM 조작을 정지시킵니다.


내 질문에 중요한 시간을 주셔서 감사합니다. Jquery Mobile 이벤트를 살펴보고 있습니다. 감사합니다.
Abhishek B.

이러한 이벤트는 실제로 실제 터치 상호 작용을 나타내는 것은 아닙니다.
trusktr

jQuery Core가 실제 명사입니까?
Peter Mortensen

6

내 프로젝트에 touchmove 만 사용하는 것에 대해 약간 걱정 했습니다. 터치가 한 위치에서 다른 위치로 이동할 때만 발생합니다 (초기 터치가 아닌). 그래서 나는 그것을 touchstart 와 결합 했고 , 이것은 초기 터치와 움직임에 매우 잘 작동하는 것 같습니다.

<script>

function doTouch(e) {
    e.preventDefault();
    var touch = e.touches[0];

    document.getElementById("xtext").innerHTML = touch.pageX;
    document.getElementById("ytext").innerHTML = touch.pageY;   
}

document.addEventListener('touchstart', function(e) {doTouch(e);}, false);
document.addEventListener('touchmove', function(e) {doTouch(e);}, false);

</script>

X: <div id="xtext">0</div>
Y: <div id="ytext">0</div>

나는 또한 마지막 사건 이후 얼마나 많은 시간이 지 났는지를 탐지하기 위해 이것을 추가했다.document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
hanamj

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