모바일 브라우저 감지


888

사용자가 모바일 브라우저를 가지고 있는지 여부를 부울 값을 반환하는 함수를 찾고 있습니다.

navigator.userAgent정규식을 사용하여 해당 기능을 사용 하고 작성할 수 있지만 사용자 에이전트는 플랫폼마다 너무 다양합니다. 가능한 모든 장치를 일치시키는 것이 쉽지 않을 것이라고 의심하고,이 문제는 여러 번 전에 해결되었으므로 그러한 작업을위한 완벽한 해결책이 있어야한다고 생각합니다.

나는 이 사이트를 보고 있었지만 슬프게도 스크립트는 너무 비밀 스럽기 때문에 스크립트를 내 목적으로 사용하는 방법을 모릅니다. 참 / 거짓을 반환하는 함수를 만드는 것입니다.



2
이것을 읽어보십시오. stackoverflow.com/questions/743129/…
KyelJmD

5
@Thrustmaster : 실제로는 그렇지 않습니다. 다른 브라우저에 다른 JS를 제공한다는 Vary: User-Agent것은 응답 에 추가해야한다는 것을 의미합니다 . 그렇지 않으면 캐싱 프록시가 한 버전을 저장하고 다른 종류의 브라우저로 보냅니다. 그러나 Vary: User-AgentIE에서 응답을 잡을 수 없게 만듭니다.
bobince

16
@ave : "모바일"브라우저를 감지하여 무엇을하려고합니까? 오늘날의 태블릿 및 하이브리드 컴퓨팅 장치에서 이러한 차이는 매우 논쟁의 여지가 있습니다. 작은 화면을 감지하고이 경우 다른 UI를 표시하려고하십니까? 저 대역폭 연결을 탐지하려고하십니까? 터치 인터페이스를 감지하려고하십니까?
bobince

2
그래서 detectmobilebrowsers.com 자바 스크립트 메소드 를 사용하도록 내 대답을 업데이트 했지만 여전히이가 필요한 경우 부울 값을 반환합니다. (만약). Happy Detecting :)
Michael Zaporozhets

답변:


1316

detectex 사용 ( detectmobilebrowsers.com ) :

다음 은 사용자가 모바일을 탐색하는지 여부에 따라 true또는 false값 을 반환하는 매우 길고 포괄적 인 정규 표현식을 사용하는 함수입니다 .

window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

이 테스트에 태블릿을 포함시키려는 경우 (아마도 그렇지는 않지만) 다음 기능을 사용할 수 있습니다.

window.mobileAndTabletCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

원래 답변

단순히 장치 목록을 통해 실행하고 useragent일치하는 항목을 확인하면됩니다 .

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];

    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

그러나이 방법이 신뢰할 수 없다고 생각하기 때문에 800x600 이하 의 해상도를 가진 모든 장치가 모바일 장치 라고 가정 하여 대상을 훨씬 더 좁힐 수 있습니다 (요즘 많은 모바일 장치는 이보다 훨씬 높은 해상도를 갖지만)

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

참고:


25
안녕하세요, 저는 iPad 3, iOS 6.1.2 의 detectmobilebrowsers.com 링크를 방문했는데 "모바일 브라우저가 감지되지 않았습니다"라고 표시되어 있습니다.
Richard Lovejoy

49
@RichardLovejoy는 사이트를 구축 할 때 일반적으로 모바일로 간주되지 않습니다.
Michael Zaporozhets

42
로부터 페이지 : 안드로이드 태블릿, 아이 패드, 킨들 파이어와 플레이 북은 디자인에 의해 감지되지 않습니다. 태블릿에 대한 지원을 추가하려면 |android|ipad|playbook|silk첫 번째 정규식에 추가하십시오 .
Gras Double

13
구글 TV도 안드로이드입니다. 모바일을 정의하는 것은 무엇입니까? 화면 크기 ? 접촉 ? deviceOrientation? 내가 디자인 할 때 마우스 호버, 큰 부톤 또는 작은 링크에 대한 질문입니다. 그래서, 지금, 나는 "if (Modernizr.touch)"로 실행 :)
molokoloco

30
Gawd, 사용자 에이전트에 대한이 전체 아이디어는 끔찍하며 실제로 중지해야합니다. 우리는 고객이 조류에 대항하여 싸우는 것을 막고 미디어 쿼리를 계속해야합니다. 그들은 특정 페이지에 대한 규모에 따라 리디렉션을 수행 할 경우, 단지 특정 미디어 쿼리를 통해 JS 즉 범위 확인 tylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

어때요?

if (typeof window.orientation !== 'undefined') { ... }

... 스마트 폰은 일반적으로이 속성을 지원하므로 데스크톱 브라우저는 지원하지 않습니다.

편집 : @Gajus가 지적 했듯이이 솔루션은 더 이상 사용되지 않으며 사용해서는 안됩니다 ( https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation )


14
이것은 실제로 매우 독특하고 굉장합니다. 내 답변에 추가해도 괜찮습니까?
Michael Zaporozhets

77
이것은 아마도 오랫동안 작동하지 않을 것입니다. 1) 태블릿은 적절한 화면 크기를 가질 수 있으며 전체 데스크톱 웹 사이트를 표시하려고하지만이 속성을 갖습니다. 2) Windows 8이 여기에 있으며 터치 스크린이있는 랩톱과 회전하는 화면이 있습니다.
Dave Hilditch

10
적절한 화면 크기의 태블릿에 대한 첫 번째 요점-다른 모든 솔루션 (작은 화면으로 추적되는 큰 화면의 태블릿)에 대해서도 동일한 주장을 할 수 있다고 생각합니다. 어쨌든 여기서 아이디어는 긴 코드를 유지하는 대신 작은 장치가 공유하는 속성을 검색하고 새로 오는 모든 장치 / 버전 / 모델에 정규식을 추가하는 것입니다. 장치 감지는 과거에 속한다고 생각하며 오늘날에는 기능 감지에 중점을 두어야합니다. 다시 그 문제에 더 적합한 속성에 대해 여기에 기뻐할 것입니다 ...
yoav barnea

2
그것을 사랑하고 완벽하게 작동합니다, 감사합니다. 내 솔루션의 경우 나는 간단하게 끝났다.
Bojangles

40
window.orientation일부 모바일 브라우저가 알 수없는 이유로 지원하기로 선택 하는 더 이상 사용되지 않는 속성 ( developer.mozilla.org/en-US/docs/Web/API/Window/orientation , compat.spec.whatwg.org/#dom-window-orientation )입니다 . 동일한 브라우저가 구현됩니다 window.screen.orientation(데스크탑 브라우저에서도 정의 됨). window.orientation레거시 이유로 인해 남아 있다고 가정 할 수 있으므로 새로운 응용 프로그램에는 사용해서는 안됩니다.
Gajus

115
var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

사용하는 방법

if( isMobile.any() ) alert('Mobile');

사용자가 특정 휴대 기기에 있는지 확인하려면 :

if( isMobile.iOS() ) alert('iOS');

참조 : http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

github의 향상된 버전 : https://github.com/smali-kazmi/detect-mobile-browser


any()ORed isMobile멤버를 for ... in 루프로 만들지 않겠습니까?
SomeShinyObject


2
어쩌면 iOS를 BlackBerry ()보다 앞서서 더 일반적인 경우를 먼저 놓고 조기 구제 금융이 추가 처리를 절약하도록 할 수 있습니까?
Rob_vH

2
@Rob_vH 나는이 코드를 github ( github.com/smali-kazmi/detect-mobile-browser )에 넣었습니다 . 당신은 또한 거기에 제안을 보낼 수 있습니다
Mudaser Ali

1
@AkarshSatija 5 개의 정규식 검사에서 성능 저하가 실제로 응용 프로그램에 영향을 줍니까? 그렇게된다면 매우 놀랐습니다. 조기 최적화는 시간 낭비 일 수 있습니다 ...
trusktr

68

다음은 페이스 북 슬링 샷 소스의 간단한 솔루션입니다.

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}

좋은. 특정 상황에서 매우 유용
Chuck Le Butt

모바일 앱을 설치할 수있는 기기를 감지하는 경우에 유용합니다. 브라우저 자체는 신경 쓰지 않습니다. 장치 / OS 만
Charlie Reitzel

30

여기에 모바일과 태블릿으로 분류되는 "터치 스크린 장치"를 감지하는 간단하고 깨끗한 방법이 필요했습니다. 현재 답변에서 깨끗한 선택을 찾지 못했지만 다음을 해결하여 누군가를 도울 수도 있습니다.

var touchDevice = ('ontouchstart' in document.documentElement);

편집 : 터치 스크린과 모바일이있는 데스크탑을 동시에 지원하려면 다음을 사용할 수 있습니다.

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);

9
데스크탑 모니터가 터치를 지원하면 어떻게됩니까?
Anton Kuzmin

@HappyCoder 데스크탑의 터치 스크린이 활성화되면 브라우저에 알리는 것이 OS에 달려 있다고 생각합니다. 예,이 검사는 여전히 유효합니다.
Tigger

(+1) 그러나 현재 사용중인 데스크톱에 터치 스크린이 있으며 항상 일관성이있는 것은 아닙니다 touchstart|end|etc.
Cody

1
부트 스트랩 날짜 선택기는 다음을 사용합니다. if (window.navigator.msMaxTouchPoints || 'ontouchstart'in document) {this.input.blur (); }
JT Taylor

1
@JTTaylor Microsoft가 권장하는 것 같습니다 navigator.maxTouchPoints( ms접두사 없음 ). 확인해야 할 MDN 기사 도 있습니다 .
Tigger

20

많은 사람들이 언급했듯이, 사용자 에이전트 데이터의 이동 목표에 의존하는 것은 문제가 있습니다. 화면 크기를 계산할 때도 마찬가지입니다.

내 접근 방식은 CSS 기술 에서 빌려 인터페이스가 터치인지 확인합니다.

모든 최신 브라우저에서 지원하는 자바 스크립트 만 사용하여 미디어 쿼리 일치는 장치가 모바일 인지 쉽게 유추 할 수 있습니다 .

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}

6
터치 지원 디스플레이가있는 노트북은 어떻습니까?
Maxim

6
! matchMedia ( "(any-pointer : fine)"). matches 나 자신을 확인합니다. ( "터치 스크린을 가지고있다"보다는 "마우스를 꽂지 않았다"
Sora2455

내 마지막 스크립트는 브라우저의 확대 / 축소 기능을 사용하는 사람들 (예 : 내가 13K 화면에서 4K로 대화 한 사람이 1080p로 떨어졌지만 여전히 확대 / 축소를 사용해야하는 사람)에 의해 속일 수 있습니다. 내 iPhone (Safari / Firefox) 및 Android 기기 (Waterfox / Chrome / "브라우저") 모든 상위 투표 응답보다 훨씬 더 안정적입니다.
John

navigator.userAgent.toLowerCase (). indexOf ( 'fennec')> -1 (아마도 가장 좋은 보충제는 아닙니다.)로 보완 한 Android에서 FireFox fennec를 감지하지 못합니다.
StayCool

2
또한 호버 속성을 테스트 할 수 있습니다 : 스마트 폰 및 터치 스크린 @media (호버 : 없음) 및 (포인터 : 굵은)
Batailley

16

사용자 에이전트를 사용한 브라우저 감지 에 대한 MDN의 기사에 따르면 가능하면이 방법을 피하고 기능 감지와 같은 다른 방법을 제안하는 것이 좋습니다.

그러나 장치가 모바일인지 감지하는 수단으로 사용자 에이전트를 사용해야하는 경우 다음을 제안합니다.

요약하면, 모바일 장치를 감지하려면 사용자 에이전트의 어느 곳에서나“Mobi”라는 문자열을 찾는 것이 좋습니다.

따라서이 단일 라이너로 충분합니다.

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

[최신 정보]:

주석에서 @ zenw0lf가 제안한 것처럼 정규 표현식을 사용하는 것이 좋습니다.

const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)


.includesIE-11 sopport하지
파샤 Oleynik

1
@PashaOleynik는 polyfill로이를 해결할 수 있습니다.
Maxim

Android가 포함 된 Nexus 7 태블릿 Mobile은 사용자 에이전트 문자열에 없습니다
Alex Sorokoletov

@AlexSorokoletov MDN 기사If the device is large enough that it's not marked with “Mobi”, you should serve your desktop site (which, as a best practice, should support touch input anyway, as more desktop machines are appearing with touchscreens).
TheDarkIn1978

1
나는 이것이 폴리 필없이 어디에서나 작동 할 것이라고 생각합니다. const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

JS 코드가 모바일 브라우저에서 실행되는지 여부를 감지하는 완벽한 솔루션은 없지만 다음 두 가지 옵션이 대부분의 경우 작동합니다.

옵션 1 : 브라우저 스니핑

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');

이 특정 브라우저 스니핑 코드는 isMobile이라는 라이브러리 의 코드입니다 .


옵션 2 : window.orientation

window.orientation정의 된 경우 테스트 :

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');


노트

모든 터치 스크린 장치가 모바일 장치 인 것은 아니며 그 반대도 마찬가지입니다. 따라서 터치 스크린 전용으로 구현하려는 경우 브라우저가 모바일 장치에서 실행되는지 테스트하지 말고 장치에 터치 스크린 지원 기능이 있는지 테스트해야합니다.

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');


오리엔테이션 접근법이 정말 좋습니다! ))
Maxim

1
나는 당신의 window.orientation해결책을 좋아 하지만 문서는 더 이상 사용되지 않는다고 말합니다! developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth

3
방향 접근 방식은 Windows 8 이상에서 방향을 변경할 수 있으므로 좋지 않습니다.
Heitor

Windows 8 이상은 모바일 지원뿐만 아니라 하이브리드 (대형 패드로 변환 할 수있는 랩탑)를 추가하는 데 중점을두기 때문에 moz가 더 이상 사용되지 않는 것으로 인식되지 않아도 방향이 감지 방법으로 실패합니다.
Jeff Clayton

그래픽 소프트웨어가 설치된 Win 7의 경우 방향을 변경할 수 있지만 데스크톱 / 랩톱에서 가로 대신 세로와 같은 다른 화면 방향을 사용하고 i를 1 분 이상 사용할 수있는 사람에게 질문을하십시오. 아무도 !!! 데스크톱에서 방향을 변경하면 화면에서 아래에서 위로 문자를 읽기 시작합니다.
GirlCode

11

일치하는 것보다 효율적인 userAgent 솔루션은 다음과 같습니다.

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}

7
테스트 방법은 대소 문자를 구분하지 않지만 정규식입니다. 마지막에 "i"로 대소 문자를 구분하지 않는 정규 표현식에 플래그를 지정할 수 있습니다./iphone|etc/i.test(navigator.userAgent)
xec

11

제어 계층을 추가하려면 HTML5 저장소를 사용하여 모바일 저장소 또는 데스크톱 저장소를 사용하고 있는지 감지합니다. 브라우저가 스토리지를 지원하지 않으면 모바일 브라우저 이름 배열이 있으며 사용자 에이전트를 배열의 브라우저와 비교합니다.

꽤 간단합니다. 기능은 다음과 같습니다.

// Used to detect whether the users browser is an mobile browser
function isMobile() {
    ///<summary>Detecting whether the browser is a mobile browser or desktop browser</summary>
    ///<returns>A boolean value indicating whether the browser is a mobile browser or not</returns>

    if (sessionStorage.desktop) // desktop storage 
        return false;
    else if (localStorage.mobile) // mobile storage
        return true;

    // alternative
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}

3
아직 모바일에서 테스트 sessionStorage.desktop하지는 않았지만 Safari, Chrome 또는 Firefox (포스트 시점의 모든 최신 버전)에는 존재하지 않습니다. 솔루션은 다른 솔루션보다 더 나은 방향으로 진행되므로 투표권이 있습니다. 그러나 var mobile =대신에 사용 하는 것을 잊지 마십시오 mobile =.
shuckster

3
또한 오래된 브라우저에서 indexOf를 사용하지 않는 것이 좋습니다.이 방법은 해당 방법을 지원하지 않거나 polyfill을 사용하는 것입니다. 소문자 값 목록에서 toLowerCase를 사용할 필요가 없으며 느린 루프 대신 /ipad|iphone|etc/i.test(navigator.userAgent)를 실행중인 경우에는 그렇게하지 않아도됩니다.
Jeffrey Gilbert

10

기능 감지는 현재 사용중인 장치를 파악하려고 시도하는 것보다 훨씬 낫고 항상 새로운 장치를 유지하는 것이 매우 어렵습니다. Modernizr 과 같은 라이브러리 는 특정 기능을 사용할 수 있는지 여부를 알려줍니다.


18
요청 된 것 이외의 다른 질문에 답변했습니다. "모바일을 어떻게 감지합니까?"대신 "특정 기능을 어떻게 감지합니까?"라고 대답했습니다. 모든 장치 감지가 기능 감지를위한 것은 아닙니다. 기기에 대한 통계를 얻으려면 어떻게해야합니까? 그러면 "기능 탐지"가 "[피겨 아웃 장치]보다 훨씬 낫지 않습니다".
Jonathan Allard 2016 년

1
이것은 대답이 아니지만 단순한 의견 이상의 가치가 있습니다. 문제는 브라우저를 왜 감지하고 터치가 부족하기 때문에 브라우저를 알고 싶을까요? 대부분의 경우 반응 형 웹 디자인으로 충분합니다.
twicejr

8

이런 건 어때?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}

screen.width대신 사용 하지 않습니까? 나보다 더 안정적인 것 같습니다 window.matchMedia.
John Slegers

좋은 지적 요한, 나는 당시에 내가 생각했던 것을 정확하게 기억할 수 없다. 첫 번째가 거짓이라면 두 번째 조항이 참을 반환 할 것 같지 않다. 내가 추가 한 이유가 있었을 것입니다.
stujo

대부분의 괜찮은 프로그래머는 1 년 전에 작성한 코드를 볼 때 부끄러워합니다. 프로그래머로 성장하지 않은 사람들 ;-)
John Slegers

4
창 해상도는 브라우저가 모바일 장치에 있는지 여부와 관련이 없습니다. 예를 들어 많은 데스크톱 브라우저가 전체 화면이 아닌 창에서 실행됩니다. 핸드 헬드 화면 용으로 설계된 UI를 해당 브라우저에 제공하면 해당 사용자는 실망스러운 경험을 갖게됩니다.
ʇsәɹoɈ

1
@ JohnSlegers-나는 인터넷 검색 질문을 부끄럽게 생각하며 stackoverflow에 대한 내 자신의 답변을 찾는 중입니다. 또 다시. 나 자신은 일정한 스택 오버플로에 있습니다
vsync

7

요소에 초점이 맞춰지면 즉시 흐려집니다. GitHub에서 거의 10,000 개의 별을 가진 매우 인기 있고 잘 유지 관리되는 구성 요소 인 Bootstrap-datepicker는 다음 방법을 사용합니다.

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}

https://github.com/uxsolutions/bootstrap-datepicker

도움 을 주신 Tigger 에게 감사합니다 .


7

모바일 또는 태블릿 장치를 감지하는 가장 좋은 방법은 브라우저가 터치 이벤트를 생성 할 수 있는지 확인하는 것입니다.

일반 자바 스크립트 코드 :

function isMobile() {
   try{ document.createEvent("TouchEvent"); return true; }
   catch(e){ return false; }
}

if (isMobile()) {
   # do whatever you wanna do!
}

이것은 정말 잘 작동했지만 터치 스크린 디스플레이가 포함 된 랩톱 장치에 문제가있을 수 있습니다.

터치 스크린 랩톱이 아직 테스트되지 않았기 때문에 모바일 장치로 감지되는지 확실하지 않습니다.


5
터치 스크린 랩톱은 모바일 장치로 감지됩니다. 데스크탑 용 터치 스크린 모니터뿐 아니라 터치 스크린 장치를 사용하여 RDP를 터치 스크린이없는 다른 장치로 RDP로 사용하는 경우에도 문제가 발생합니다.
blissfool

@ blissfool 나는 이것이 모바일 장치를 감지하는 올바른 방법이 아닐 것이라고 생각합니다.
Neo Morina

불행하게도. 그러나 매우 제한된 사용 사례에는 여전히 실행 가능한 옵션 일 수 있습니다.
blissfool

예외를 기반으로 코드를 작성하지 마십시오. 어떤 경우에도 확실히 발생합니다.
Pablo

@Sivic TouchEvent가 존재하지 않고 위의 코드가 그것을 잡으면 false를 반환합니다. 모바일 또는 태블릿 또는 기타 터치 스크린 장치에는 해당되지 않습니다.
Neo Morina

5

다음은 문제에 대한 다시 생각한 해결책입니다. 여전히 완벽하지는 않습니다. 유일한 해결책은 장치 제조업체가 "모바일"및 "태블릿"사용자 에이전트 문자열을 심각하게 받아들이 기 시작하는 것입니다.

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}

Nexus 7 태블릿에 Android UA 문자열 만 있으면 어떻게 되나요? 첫째, 모바일이 true가되고 나중에 태블릿에서도 true가되지만 태블릿은 body 태그에서 Mobile UA 문자열을 삭제합니다.

CSS :

body.tablet { background-color: green; }
body.mobile { background-color: red; }

alert개발을 위해 추가 된 라인. Chrome 콘솔은 많은 휴대용 기기를 에뮬레이션 할 수 있습니다. 거기서 테스트하십시오.

편집하다:

이것을 사용하지 말고 대신 기능 감지를 사용하십시오. 브랜드를 타겟팅하는 것이 올바른 솔루션이 될 수있는 기기와 브랜드가 너무 많습니다.


4

나는 당신이 http://wurfl.io/ 를 확인하는 것이 좋습니다

간단히 말해서 작은 JS 파일을 가져 오는 경우 :

<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>

다음과 같은 JSON 객체가 남습니다.

{
 "complete_device_name":"Google Nexus 7",
 "is_mobile":true,
 "form_factor":"Tablet"
}

(물론 Nexus 7을 사용한다고 가정하면) 다음과 같은 작업을 수행 할 수 있습니다.

if(WURFL.form_factor == "Tablet"){
    //dostuff();
}

이것은 당신이 찾고있는 것입니다.

면책 조항 : 나는이 무료 서비스를 제공하는 회사에서 일합니다. 감사.


1
그리고 어떻게 아이폰에 사파리를 인식하지 못합니까?
Amyth

사용중인 브라우저 (정확한 UA 문자열이 완벽 할 것임), 어떤 데이터 및 기대하는 것을 확장 할 수 있습니까?
Luca Passani

나도 wurfl을 시도했는데 IOS 11.2를 실행하는 iPhone 5C에 있습니다. Safari를 모바일 브라우저로 인식하지 않습니다. "is_mobile": true를 사용하고 "form_factor": 스마트 폰을 사용하려고합니다.
Mike Wells

회사의 모바일 데이터 전문가에게 문의해야했으며 OS 11.2가 5C에서 실행되지 않는다고 말합니다. 가장 낮은 장치는 5S입니다. 그래서 당신이 쓴 것이 옳지 않습니다. 연결 해제 위치를 확인하려면 ScientiaMobile에 오프라인으로 문의하십시오. 감사합니다
Luca Passani 11:20

4

여기에 하나의 라이너

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};

3

사용 사례에 따라 다릅니다. 모든 모바일 장치에는 배터리가 필요합니다. 배터리를 소모하지 않고 컴퓨팅 전원을 사용하는 경우 Battery Status API를 사용하십시오 .

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});

찾고있는 것이 presentational use matchMedia인 경우 부울 값을 반환합니다.

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

또는 태블릿 장치에서 더 나은 사용자 경험을 위해 이들을 결합하십시오.


브라우저에서 배터리 상태 API가 제거되고 있습니다.
Sora2455

배터리 상태 API는 Firefox에서 제거되었지만 2016 년 7 월 이후 로 W3C 후보 권장 사항으로 유지 되며 인기있는 브라우저에서 계속 작동하며 경험을 형성하는 데 유용합니다 .
Josh Habdas

2

ECMAScript 6 솔루션은 다음과 같습니다 (TypeScript 지원).

public isMobile(): boolean {
  let check = false;
  ((a => {
      if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
      }))(navigator.userAgent || navigator.vendor);
  return check;
 }

왜이 if전체 check변수 를 갖는 대신 조건을 반환하지 않습니까?
Vic

2

그것이 모바일 장치인지 아닌지를 감지하는 간단한 트릭이 있습니다. ontouchstart 이벤트가 존재 하는지 확인하십시오 .

function isMobile()
{
    return "ontouchstart" in window;
}

3
터치 스크린 모니터가있는 랩톱 및 데크 스톱에서는 작동하지 않습니다. Surface와 같은 하이브리드 PC에서도 문제가 발생합니다. 데스크탑에 대한 문제는 적지 만 요즘에는 더 많은 터치 스크린 랩탑이 판매되고 있습니다.
blissfool 2016 년

2

위의 답변이 저에게 도움이되는 몇 가지 시나리오에 직면했습니다. 그래서 나는 이것을 생각해 냈습니다. 누군가에게 도움이 될 수 있습니다.

if(/iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent)
 || screen.availWidth < 480){
//code for mobile
}

사용 사례에 따라 다릅니다. 화면 사용에 초점을 맞추 screen.availWidth거나 document.body.clientWidth문서를 기반으로 렌더링하려는 경우 사용할 수 있습니다 .


1

최고는 :

var isMobile = (/Mobile/i.test(navigator.userAgent));

그러나 Yoav Barnea가 말한 것처럼 ...

// Seem legit
var isMobile = ('DeviceOrientationEvent' in window || 'orientation' in window);
// But with my Chrome on windows, DeviceOrientationEvent == fct()
if (/Windows NT|Macintosh|Mac OS X|Linux/i.test(navigator.userAgent)) isMobile = false;
// My android have "linux" too
if (/Mobile/i.test(navigator.userAgent)) isMobile = true;

이 3 테스트 후 var isMobile이 좋기를 바랍니다.


> 파이어 폭스 모바일 안드로이드 '창에서'방향 ' "이하지 않는 것
molokoloco

1
죄송합니다. 이제는 저렇게 잘 작동합니다. "if (Modernizr.touch) / * ... * /"그리고 계속 ...
molokoloco

터치 스크린 데스크탑 장치에서 Modernizr.touch가 어떻게 작동하는지 궁금합니다.
B2K

더 우아하게 만들려면 모든 te 코드를 if-else if-else if 블록으로 만 작성해야합니다.
Heitor

1

여기 그는 완전한 기능입니다

function isMobile(){
    return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(navigator.userAgent||navigator.vendor||window.opera)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test((navigator.userAgent||navigator.vendor||window.opera).substr(0,4)))
}

jQuery.noConflict();
jQuery(document).ready(function(){
    if(isMobile()) alert("Mobile"); else alert("Not Mobile");
});

.substr (0,4)는 처음 4자를 반환합니다. "android. + mobile"을 어떻게 감지합니까?
raacer

1
@raacer 실제로 두 줄의 정답이 있습니다 (둘 다 같은 줄에 있음). 첫 번째 줄은 전체 UA 문자열을 확인하고 안드로이드, 모바일 등을 찾습니다. 두 번째 줄은 UA의 처음 4 문자 만 확인합니다. .
JackW

1
//true / false
function isMobile()
{
   return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ); 
}

또한이 자습서를 따라 특정 모바일을 감지 할 수 있습니다. 여기를 클릭 하십시오 .


MobileRX에 추가 하십시오
oriadam

1

"window.screen.width"를 사용하는 방법은 무엇입니까?

if (window.screen.width < 800) {
// do something
}

또는

if($(window).width() < 800) {
//do something
}

매일 새로운 모바일 장치가 있기 때문에 이것이 최선의 방법이라고 생각합니다!

(구식 브라우저에서는 지원되지 않지만 시도해보십시오.))


1
조경이란 무엇입니까?
Erick Voodoo

1
특정 시나리오에는 그다지 유용하지 않습니다. 데스크톱 브라우저의 크기가 조정되면 모바일 브라우저로 잘못 감지 될 수 있습니다.
toing_toing

PC는 사용성, 끔찍한 대답면에서 모바일 장치와 본질적으로 다릅니다!
Heitor

1

대부분의 최신 모바일 장치는 이제 600x400 이상의 해상도를가집니다. 즉, 아이폰 6 ...

테스트 증명 : 여기에서 가장 점검이 많고 가장 최근에 게시 한 게시물을 한 번 선택적으로 실행하여 다음과 같이 실행했습니다.

(function(a){
    window.isMobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
})(navigator.userAgent||navigator.vendor||window.opera);

alert("This browser was found to be a % browser.", window.isMobile ? 'mobile' : 'desktop');

어쨌든 다음과 같은 결과가 다음 브라우저 앱에서 반환되었습니다. 사양 : iPhone 6S, iOS 10.3.1.

Safari (최신) : 모바일로 감지했습니다.

Chrome (최신) : 모바일로 감지하지 못했습니다.

그래서 나는 Lanti ( https://stackoverflow.com/a/31864119/7183483 ) 의 제안을 테스트했으며 올바른 결과 (모든 iOS 장치의 모바일 및 내 Mac의 데스크톱)를 반환했습니다. 따라서 두 번 (모바일 및 태블릿 모두) 실행되므로 약간 편집을 계속했습니다. 그런 다음 iPad에서 테스트 할 때 모바일로도 돌아 왔다는 것을 알았습니다. Lanti무엇보다 OS를 점검하십시오. 따라서 모바일 확인 내에서 태블릿 IF 문을 이동하면 태블릿 확인이 음수이면 모바일이 반환되고 그렇지 않으면 태블릿이 반환됩니다. 그런 다음 모바일 검사에 대해 else 절을 ​​추가하여 데스크톱 / 랩톱으로 반환하므로 브라우저와 CPU 및 OS 브랜드가 감지됩니다. 그래서 대신 if 문의 일부로 반환 된 것을 추가했습니다. 한마디로, 아무것도 감지되지 않은 경우에 else주의 문구를 추가했습니다. 아래를 참조하십시오. 곧 Windows 10 PC에서 테스트로 업데이트됩니다.

아, 그리고 디버그와 일반 컴파일 사이를 쉽게 전환하기 위해 'debugMode'변수도 추가했습니다.

면책 조항 : Lanti에 대한 완전한 신용은 또한 Windows 태블릿에서 테스트되지 않았다는 것입니다 ... OS는 순수한 Windows이기 때문에 데스크탑 / 랩톱을 반환 할 수 있습니다. 내가 사용하는 친구를 찾으면 확인합니다.

function userAgentDetect() {
    let debugMode = true;
    if(window.navigator.userAgent.match(/Mobile/i)
        || window.navigator.userAgent.match(/iPhone/i)
        || window.navigator.userAgent.match(/iPod/i)
        || window.navigator.userAgent.match(/IEMobile/i)
        || window.navigator.userAgent.match(/Windows Phone/i)
        || window.navigator.userAgent.match(/Android/i)
        || window.navigator.userAgent.match(/BlackBerry/i)
        || window.navigator.userAgent.match(/webOS/i)) {
        if (window.navigator.userAgent.match(/Tablet/i)
            || window.navigator.userAgent.match(/iPad/i)
            || window.navigator.userAgent.match(/Nexus 7/i)
            || window.navigator.userAgent.match(/Nexus 10/i)
            || window.navigator.userAgent.match(/KFAPWI/i)) {
            window.deviceTypeVar = 'tablet';
            if (debugMode === true) {
                alert('Device is a tablet - ' + navigator.userAgent);
            }
        } else {
            if (debugMode === true) {
                alert('Device is a smartphone - ' + navigator.userAgent);
            };
            window.deviceTypeVar = 'smartphone';
        }
    } else if (window.navigator.userAgent.match(/Intel Mac/i)) {
        if (debugMode === true) {
            alert('Device is a desktop or laptop- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'desktop_or_laptop';
    } else if (window.navigator.userAgent.match(/Nexus 7/i)
        || window.navigator.userAgent.match(/Nexus 10/i)
        || window.navigator.userAgent.match(/KFAPWI/i)) {
        window.deviceTypeVar = 'tablet';
        if (debugMode === true) {
            alert('Device is a tablet - ' + navigator.userAgent);
        }
    } else {
        if (debugMode === true) {
            alert('Device is unknown- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'Unknown';
    }
}

1

이것은 내 프로젝트에서 사용 하는 승인 된 답변 의 es6 포트 일뿐 입니다. 여기에는 태블릿도 포함됩니다.

export const isMobile = () => {
  const vendor = navigator.userAgent || navigator.vendor || window.opera;

  return !!(
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
      vendor
    ) ||
    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(
      vendor.substr(0, 4)
    )
  );
};

1

return 'ontouchstart' in window && window.screen.availWidth < 768

이 방법은 위의 답변에서 확장되지만 화면 크기도 확인합니다.


1

detectex 사용 ( detectmobilebrowsers.com ) :

/* eslint-disable */
export const IS_MOBILE = (function (a) {
  return (
    /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
      .test(
        a.substr(0,4)
      )
  )
  // @ts-ignore
})(navigator.userAgent || navigator.vendor || window.opera)
/* eslint-enable */

0

이것은 또한 해결책이 될 수 있습니다.

var isMobile = false; //initiate as false

  // device detection
  if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
  || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;

  console.log('Mobile device:'+isMobile);

  var doc_h = $(document).height(); // returns height of HTML document
  var doc_w = $(document).width(); // returns width of HTML document
  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  var iPadVertical = window.matchMedia("(width: 768px) and (height: 1024px) and (orientation: portrait)");
  var iPadHoricontal = window.matchMedia("(width: 1024px) and (height: 767px) and (orientation: landscape)");

  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  if (iPadVertical.matches) {
      console.log('Ipad vertical detected');
  }else if (iPadHoricontal.matches){
      console.log('Ipad horicontal detected');
  }else {
      console.log('No Ipad');
  }

두 방법을 모두 사용하면 다른 장치를 완벽하게 감지 할 수 있습니다.

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