[javascript] JavaScript를 사용하여 ‘터치 스크린’장치를 감지하는 가장 좋은 방법은 무엇입니까?
데스크톱 및 모바일 장치 모두에서 사용할 수있는 jQuery 플러그인을 작성했습니다. 장치에 터치 스크린 기능이 있는지 감지하는 JavaScript가 가능한지 궁금했습니다. jquery-mobile.js를 사용하여 터치 스크린 이벤트를 감지하고 iOS, Android 등에서 작동하지만 사용자의 장치에 터치 스크린이 있는지 여부에 따라 조건문을 작성하고 싶습니다.
가능합니까?
답변
업데이트 : 전체 기능 탐지 라이브러리를 프로젝트로 가져 오기 전에 아래 blmstr의 답변을 읽으 십시오. 실제 터치 지원 감지는 더 복잡하며 Modernizr은 기본 사용 사례 만 다룹니다.
Modernizr 은 모든 사이트에서 모든 종류의 기능 탐지를 수행 할 수있는 훌륭하고 가벼운 방법입니다.
단순히 각 기능의 html 요소에 클래스를 추가합니다.
그런 다음 CSS 및 JS에서 이러한 기능을 쉽게 대상으로 지정할 수 있습니다. 예를 들면 다음과 같습니다.
html.touch div {
width: 480px;
}
html.no-touch div {
width: auto;
}
그리고 자바 스크립트 (jQuery 예제) :
$('html.touch #popup').hide();
답변
이 기능을 사용해 보셨습니까? (이것은 Modernizr이 사용했던 것과 동일합니다.)
function is_touch_device() {
try {
document.createEvent("TouchEvent");
return true;
} catch (e) {
return false;
}
}
console.log(is_touch_device());
업데이트 1
document.createEvent("TouchEvent")
true
최신 크롬 으로 돌아 가기 시작했습니다 (17 절). Modernizr는 이것을 얼마 전에 업데이트했습니다. 여기서 Modernizr 테스트를 확인하십시오 .
다음과 같이 기능을 업데이트하여 작동 시키십시오.
function is_touch_device1() {
return 'ontouchstart' in window;
}
console.log(is_touch_device1());
업데이트 2
위의 내용이 IE10에서 작동하지 않는 것으로 나타났습니다 (MS Surface에서 false 반환). 수정 사항은 다음과 같습니다.
function is_touch_device2() {
return 'ontouchstart' in window // works on most browsers
|| 'onmsgesturechange' in window; // works on IE10 with some false positives
};
console.log(is_touch_device2());
업데이트 3
'onmsgesturechange' in window
일부 IE 데스크톱 버전에서는 true를 반환하므로 신뢰할 수 없습니다. 이것은 약간 더 안정적으로 작동합니다.
function is_touch_device3() {
return !!('ontouchstart' in window // works on most browsers
|| navigator.maxTouchPoints); // works on IE10/11 and Surface
};
console.log(is_touch_device3());
2018 업데이트
시간이 지남에 따라 이것을 테스트하는 새롭고 더 나은 방법이 있습니다. 나는 기본적으로 Modernizr의 확인 방법을 추출하고 단순화했습니다.
function is_touch_device4() {
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
var mq = function (query) {
return window.matchMedia(query).matches;
}
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
return true;
}
// include the 'heartz' as a way to have a non matching MQ to help terminate the join
// https://git.io/vznFH
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
return mq(query);
}
console.log(is_touch_device4());
여기서 그들은 비표준 touch-enabled
미디어 쿼리 기능을 사용하고 있습니다. 이것은 다소 이상하고 나쁜 습관이라고 생각합니다. 그러나 이봐, 현실 세계에서 나는 그것이 작동한다고 생각한다. (그들은 모두 지원하는) 앞으로 그 미디어 쿼리 기능은 당신에게 동일한 결과를 줄 수 : pointer
와 hover
.
Modernizr이 어떻게하고 있는지 소스를 확인하십시오 .
터치 감지 문제를 설명하는 유용한 기사를 보려면 Stu Cox : 터치 스크린을 감지 할 수 없습니다를 참조하십시오
.
답변
Modernizr은 Windows Phone 8 / WinRT에서 IE10을 감지하지 못하므로 간단한 크로스 브라우저 솔루션은 다음과 같습니다.
var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
기기가 터치를 갑자기 지원하지 않거나 지원하지 않기 때문에 한 번만 확인하면되므로 여러 번 더 효율적으로 사용할 수 있도록 변수에 저장하면됩니다.
답변
위의 모든 주석을 사용하여 내 요구에 맞는 다음 코드를 작성했습니다.
var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0));
나는 이것을 iPad, Android (브라우저 및 Chrome), Blackberry Playbook, iPhone 4s, Windows Phone 8, IE 10, IE 8, IE 10 (터치 스크린이있는 Windows 8), Opera, Chrome 및 Firefox에서 테스트했습니다.
현재 Windows Phone 7에서 실패하고 해당 브라우저에 대한 솔루션을 아직 찾을 수 없습니다.
누군가가 이것을 유용하게 사용하기를 바랍니다.
답변
상호 작용 미디어 기능 이 도입 되었으므로 간단히 수행 할 수 있습니다.
if(window.matchMedia("(pointer: coarse)").matches) {
// touchscreen
}
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
업데이트 (의견으로 인해) : 위의 해결책은 “거친 포인터”(일반적으로 터치 스크린)가 기본 입력 장치인지 감지하는 것입니다. 마우스와 같은 장치에 터치 스크린이 있는지 여부를 결정하려는 경우 사용할 수 있습니다any-pointer: coarse
대신 .
자세한 내용은 여기를 참조하십시오. 브라우저에 마우스가없고 터치 전용인지 감지
답변
난이게 좋아:
function isTouchDevice(){
return typeof window.ontouchstart !== 'undefined';
}
alert(isTouchDevice());
답변
당신이 사용하는 경우 모더 나이저를 , 그것은 매우 쉽게 사용할 수 있나요 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 모바일 장치를 제공 할 수 있습니다 Windows Phone
.