Javascript로 터치 스크린 장치 감지


129

Javascript / jQuery에서 클라이언트 장치에 마우스가 있는지 어떻게 알 수 있습니까?

사용자가 항목 위로 마우스를 가져 가면 정보 패널이 약간 위로 미끄러지는 사이트가 있습니다. jQuery.hoverIntent를 사용하여 호버를 감지하고 있지만 iPhone / iPad / Android와 같은 터치 스크린 장치에서는 작동하지 않습니다. 따라서 해당 장치에서 정보 패널을 표시하기 위해을 탭하여 되돌리고 싶습니다.


6
왜 둘 다 할 수 없습니까? 터치 스크린이 아닌 장치에서 탭 기능이 바람직하지 않습니까?
— EMPraptor

1
일부 최신 장치는을 지원하지 않기 때문에 순전히 미용 목적으로 :hover사용 :hover하는 것이 더 좋습니다 (여러 장치에 대해 하나의 스타일 시트를 코딩 할 때) .
— Dr.

@ empraptor : 좋은 지적-네, 그렇게 할 수 있습니다. 그러나 우리는 또한 항상 터치 스크린 장치에 패널을 표시 할 생각을하고있었습니다.이 경우 지원을 감지 할 수 있어야합니다.
— Brad Robinson

터치 스크린 장치에서 항상 패널을 표시 할 수 있다면 다른 장치에서도 패널을 표시 할 수 없습니까? 패널은 얼마나 크며 호버 / 탭에만 표시하는 것이 바람직한가요?
— EMPraptor

답변:


12

수행하기위한 하나 hover와 click둘. 또 다른 방법은 CSS 미디어 쿼리를 사용하고 터치 / 탭 기능이있을 가능성이 큰 작은 화면 / 휴대 기기에만 일부 스타일을 사용하는 것입니다. 따라서 CSS를 통해 특정 스타일이 있고 jQuery에서 모바일 장치 스타일 속성에 대한 해당 요소를 확인하면 모바일 특정 코드를 작성하기 위해 해당 요소에 연결할 수 있습니다.

여기를 참조하십시오 : http://www.forabeautifulweb.com/blog/about/hardboiled_css3_media_queries/


1
좋은 해결책, one () 바인드로 호버 확인과 같은 작업을 수행 할 수 있으므로 처음으로 만 실행됩니다.
— Timothy Perez

문제는 화면 너비로 대상을 설정 한 다음 장치를 회전 할 때 (iphone 6 + 736x414를 가져 가야 함) 동일한 스타일을 갖지 못한다는 것입니다. 최상의 해결책은 아닙니다 : /
— antoni

266
var isTouchDevice = 'ontouchstart' in document.documentElement;

참고 : 장치가 터치 이벤트를 지원한다고해서 반드시 터치 스크린 장치라는 의미는 아닙니다. 내 Asus Zenbook과 같은 많은 장치는 실제 터치 입력 메커니즘이없는 경우에도 클릭 및 터치 이벤트를 모두 지원합니다. 터치 지원을 설계 할 때는 항상 클릭 이벤트 지원을 포함하고 어떤 장치가 하나만 있다고 가정하지 마십시오.


33
Modernizr 문서에서 설명했듯이 이것은 장치 기능이 아닌 브라우저 기능 만 감지 합니다. 터치 가능 브라우저를 실행하는 터치 입력이없는 장치에서는 오 탐지 결과가 나타납니다. 터치 이벤트가 발생할 때까지 기다리지 않고 장치 터치 기능을 기본적으로 감지하는 방법을 모르겠습니다 .
— Stu Cox

12
IE 10 터치도 감지하려면 다음을 사용하십시오. (window.navigator.msMaxTouchPoints || (document.documentElement의 'ontouchstart'));
— Alexander Kellett

2
'ontouchstart' in document.documentElement BlackBerry 9300에서 True를 잘못 반환합니다.
— Simpler

10
@typhon 소프트웨어 (Win 8, 최신 브라우저)가 터치를 지원하는 경우 터치를 지원하지 않는 하드웨어 (데스크톱, 표준 모니터, 마우스 및 키보드)를 사용하는 경우에도 항상 적용됩니다. 따라서이 솔루션은 오래되었습니다.
— Barney

1
funnyItsNotCamelCaseAsJsIsThroughout. 사람들은 이제 코드를 복사, 붙여 넣기 및 편집해야합니다. :)
— Ross

20

window.Touch에 대한 테스트를 찾았습니다 .Android에서는 작동하지 않지만 다음과 같이 작동합니다.

function is_touch_device() {
  return !!('ontouchstart' in window);
}

문서를 참조하십시오 자바 스크립트를 사용하여 '터치 스크린'장치를 감지 할 수있는 가장 좋은 방법은 무엇입니까?


터치 스크린을 감지하지만 터치 스크린이있는 랩톱에서도 TRUE를 반환하므로주의하십시오. 터치 스크린이있는 랩톱의 경우 TRUE를 반환하기 때문에 사용자가 전화 / 태블릿 또는 컴퓨터 / 노트북과 구별되는지 확인하려는 경우 문제가 될 수 있습니다.
— 결합

8
return (('ontouchstart' in window)
      || (navigator.maxTouchPoints > 0)
      || (navigator.msMaxTouchPoints > 0));

msMaxTouchPoints와 함께 maxTouchPoints를 사용하는 이유 :

Microsoft는 Internet Explorer 11부터이 속성의 Microsoft 공급 업체 접두사 버전 (msMaxTouchPoints)을 제거 할 수 있으며 대신 maxTouchPoints를 사용하는 것이 좋습니다.

출처 : http://ctrlq.org/code/19616-detect-touch-screen-javascript


이것은 Chrome Chrome 개발자 도구에서 기기를 사용해 주셔서 감사합니다.
— Behnam Mohammadi

7
if ("ontouchstart" in window || navigator.msMaxTouchPoints) {
    isTouch = true;
} else {
    isTouch = false;
}

모든 곳에서 작동합니다!


그리고 그것은 마우스와 어떤 관련이 있습니까? (실제 질문)
— hexalys

보다 간단합니다isTouch = "ontouchstart" in window || navigator.msMaxTouchPoints;
— Andrew


4

Chrome은 다음에 대해 오 탐지를 반환하는 것 같습니다.

var isTouch = 'ontouchstart' in document.documentElement;

"터치 이벤트 에뮬레이션"(F12-> 오른쪽 하단 모서리의 설정-> "재정의"탭-> 마지막 확인란)과 관련이 있다고 생각합니다. 기본적으로 사용 중지되어 있음을 알고 있지만 이것이 결과 변경 사항 (Chrome에서 작동하는 데 사용 된 'in'방법)과 연결되는 것입니다. 그러나 이것은 테스트 한 한 작동하는 것 같습니다.

var isTouch = !!("undefined" != typeof document.documentElement.ontouchstart);

typeof 가 "object"인 상태에서 해당 코드를 실행 한 모든 브라우저 는 그것이 정의되지 않은 것임을 알고 더 확실합니다 :-)

IE7, IE8, IE9, IE10, Chrome 23.0.1271.64, iPad 용 Chrome 21.0.1180.80 및 iPad Safari에서 테스트되었습니다. 누군가가 더 많은 테스트를하고 결과를 공유하면 멋질 것입니다.


두 방법 모두 FF 23 및 Chrome 28이 포함 된 Win 8 PC에서 오 탐지를 반환합니다.이 경우는 항상 FF와 Chrome을 설치하기 전에이 컴퓨터에 터치 스크린이 연결되어 있기 때문입니까? "터치 이벤트 에뮬레이션"옵션이 없습니다.
— typhon

어, 항상 새로운 하드웨어와의 싸움입니다. 브라우저는 항상 모든 것을 구현하지는 않지만 OS 추상화 계층과 함께 작동해야합니다. 즉, JS를 사용하면 브라우저에 의존해야합니다 :) 보편적 인 방법은 없습니다.
— Ash

두 가지 모두 비 터치 랩톱의 Ubuntu Firefox에서 true를 반환합니다.
— NoBugs

4

내 사이트 중 하나에 대해 이것을 작성했으며 아마도 가장 완벽한 솔루션 일 것입니다. 특히 Modernizr조차도 터치 감지에 대해 오 탐지를 얻을 수 있기 때문에.

jQuery를 사용하는 경우

$(window).one({
  mouseover : function(){
    Modernizr.touch = false; // Add this line if you have Modernizr
    $('html').removeClass('touch').addClass('mouse');
  } 
});

아니면 그냥 순수한 JS ...

window.onmouseover = function(){ 
    window.onmouseover = null;
    document.getElementsByTagName("html")[0].className += " mouse";
}

4
하지만 조심하세요 : 적어도 아이 패드도
— 마우스를 던집니다

14
젠장 애플!
— Timothy Perez

Windows 태블릿에서 IE를 사용하는 사람들은 터치와 마우스를 모두 사용할 수 있습니다.
— Sebazzz

이 게시물은 Windows 태블릿이 출시되기 전에 작성되었습니다.
— Timothy Perez

@ s427-Fecking IE ... IE8을 확인하십시오. IE8이 <= 인 휴대 기기는 없다고 생각합니다.
— Timothy Perez

4

첫 번째 게시물 / 코멘트 : 클릭하기 전에 'touchstart'가 시작된다는 것을 모두 알고 있습니다. 또한 사용자가 페이지를 열면 1) 마우스를 움직입니다. 2) 클릭 3) 화면을 터치합니다 (스크롤을 위해 또는 ... :)).

뭔가 해보자 :

//-> 시작 : jQuery

var hasTouchCapabilities = 'ontouchstart' in window && (navigator.maxTouchPoints || navigator.msMaxTouchPoints);
var isTouchDevice = hasTouchCapabilities ? 'maybe':'nope';

//attach a once called event handler to window

$(window).one('touchstart mousemove click',function(e){

    if ( isTouchDevice === 'maybe' && e.type === 'touchstart' )
        isTouchDevice = 'yes';
});

// <-끝 : jQuery

좋은 하루 보내세요!


3

토론에서 위에서 언급 한 다음 코드를 테스트했습니다.

 function is_touch_device() {
    return !!('ontouchstart' in window);
 }

아이폰에서 안드로이드 모질라, 크롬, 오페라, 안드로이드 기본 브라우저 및 사파리에서 작동 ... 모든 긍정적 인 ...

나를 위해 단단한 것 :)


매우 간단하고 잘 작동합니다. Android (구 Galaxy Note) 및 에뮬레이터 (Chrome) 및 iPad에서 테스트되었습니다.
— Ralf

Chrome에서 나에게 오 탐지를 반환합니다.
— James


2

이것은 나를 위해 작동합니다 :

function isTouchDevice(){
    return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch);
}

1
테스트 한 플랫폼, 브라우저, OS '기기는 몇 개입니까?
— BerggreenDK

1
FF, Chrome, Android 및 iOS (iPad)의 Safari
— Turtletrail

1
충분 해요 방금 데스크톱에서 테스트했으며 IF 구조를 약간 해킹하게 만드는 많은 "정의되지 않은"것을 얻었습니다. 반환 값을 다음과 같이 조금만 조정하면 다음과 같이 반환됩니다. return true == (window || window.DocumentTouch의 "ontouchstart".DocumentTouch 및 DocumentTouch의 문서 인스턴스); 그럼 당신은 참 또는 거짓 :-)
— BerggreenDK

2
Chrome에서는 PC의 터치 스크린이없는 창에서 "ontouchstart"가 true이므로 작동하지 않습니다. 앞에서 언급했듯이 브라우저가 터치 가능한지 테스트합니다. 또한 true ==는 아무것도하지 않으므로 생략해야합니다.
— rakensi

1
에뮬레이터가 내장 된 Chrome 에서이 작업을 시도하면 에뮬레이터에서 스위치를 켤 때 터치를 감지하고 스위치를 끌 때 터치를 감지하지 않습니다. 그래서 나를 위해 잘 작동합니다. 그러나 : 나는 Prasad (아래)의 짧은 버전을 사용합니다. Turtletrail의 코드에서. 그리고 나는 그것이 100 % 장치에서 작동하는지 상관하지 않습니다. 99 %가 저를 위해 할 것입니다.
— Ralf

1

Modernizr 을 사용하면 사용 하기가 매우 쉽습니다.Modernizr.touch 앞서 언급 한 바와 같이.

그러나 Modernizr.touch안전한 사용을 위해 조합 및 사용자 에이전트 테스트를 사용하는 것이 좋습니다.

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/ipod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

Modernizr을 사용하지 않으면 간단히 Modernizr.touch 위 함수를('ontouchstart' in document.documentElement)

또한 사용자 에이전트를 테스트하면 iemobile탐지 된 Microsoft 모바일 장치보다 더 넓은 범위의 감지 된 Microsoft 모바일 장치가 제공됩니다.Windows Phone .

또한이 SO 질문을 참조하십시오


2
지금은 4 가지 질문에 대해 같은 대답을하고 있습니다. 이것은 그가 묻는 질문에 대한 해결책이 아닙니다.
— jycr753

1
나는 그것이 여기서 질문에 대답한다고 믿는다
— Peter-Pan

대답은 아니지만 사용자가 장치를 만지기 전에 장치를 만질 수 있는지 감지하려는 사람을위한 힌트입니다.
— Shahadat Hossain Khan

1

jQuery Mobile에서 간단하게 다음을 수행 할 수 있습니다.

$.support.touch

이것이 왜 문서화되지 않은지 모릅니다. 그러나 크로스 브라우저 안전합니다 (현재 브라우저의 최신 2 개 버전).


0

이미 언급했듯이 장치는 마우스와 터치 입력을 모두 지원할 수 있습니다. 종종 "지원되는 내용"이 아니라 "현재 사용중인 내용"이라는 질문이 있습니다.

이 경우 마우스 이벤트 (호버 리스너 포함)와 터치 이벤트를 간단히 등록 할 수 있습니다.

element.addEventListener('touchstart',onTouchStartCallback,false);

element.addEventListener('onmousedown',onMouseDownCallback,false);

...

JavaScript는 사용자 입력에 따라 올바른 리스너를 자동으로 호출해야합니다. 터치 이벤트의 경우onTouchStartCallback 호버 코드를 에뮬레이트하여 시작됩니다.

터치는 두 종류의 청취자, 터치 및 마우스를 모두 발사 할 수 있습니다. 그러나 터치 리스너가 먼저 진행되고을 호출하여 후속 마우스 리스너가 실행되는 것을 막을 수 있습니다 event.preventDefault().

function onTouchStartCallback(ev) {
    // Call preventDefault() to prevent any further handling
    ev.preventDefault();
    your code...
}

자세한 내용은 여기를 참조하십시오 .


-3

iPad 개발을 위해 다음을 사용하고 있습니다.

  if (window.Touch)
  {
    alert("touchy touchy");
  }
  else
  {
    alert("no touchy touchy");
  }

그런 다음 터치 기반 이벤트 (예 : ontouchstart) 또는 마우스 기반 이벤트 (예 : onmousedown)에 선택적으로 바인딩 할 수 있습니다. 아직 안드로이드에서 테스트하지 않았습니다.


1
Opera Mobile 10 또는 Internet Explorer Mobile 6 (Windows Mobile 6.5)에서는 작동하지 않습니다.
— doubleJ

4
나쁜 크로스 브라우저 / 크로스 OS / 크로스 플랫폼 조언.
— BerggreenDK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.