Javascript로 터치 스크린 장치 감지


129

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

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


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

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

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

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

답변:


12

수행하기위한 하나 hoverclick둘. 또 다른 방법은 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.