자바 스크립트 : 사용자 브라우저가 Chrome인지 확인하는 방법


220

브라우저가 Chrome 인지 확인하려면 부울 값을 반환하는 함수가 필요합니다 .

그러한 기능을 어떻게 만듭니 까?


16
대신 '기능이 필요합니까?'라고 묻는 대신 기능 감지를 원하지 않습니까?
bdukes

42
누가 알아? 그는 사용자가 크롬 확장 프로그램을 다운로드하도록 할 수 있습니다
naveen

2
이 질문은 사용자 에이전트 감지 문제를 보여줍니다. 불과 3 년 후, Fun 3D Box Background는 저급 휴대 전화를 Chrome에로드하려고 시도하지만 고급 데스크톱 컴퓨터의 Firefox에서는 시도하지 않습니다.
Álvaro González

5
기능 감지가 나아갈 길에 동의합니다. 그러나 당신이 감지하고 싶은 합법적 인 영역이 있습니다. 예를 들어 크롬 전용 xhr.sendAsBinary 패치를 원합니다. 내 초기 솔루션은 filereader.readasbinary가 구현되었는지 확인했습니다. 그러나 특정 모바일 브라우저에도 패치가 적용되어 업로드가 실패하는 문제가 있습니다. 이 수정은 크롬에만 필요합니다.
frostymarvelous

4
브라우저가 Chrome인지 확인하는 것이 왜 중요한지 알고 싶으십니까? Chrome에서 RSS 피드를로드 할 수없는 것은 어떻습니까? 따라서 Chrome에로드되지 않는 RSS 피드에 연결하는 대신 실제로 경고를 제공하거나 사용자를 리디렉션 할 수 있습니까? 구글 크롬 덕분에 ...
Pic Mickael 3

답변:


205

업데이트 : 이를 처리하는 업데이트 된 방법 은 Jonathan의 답변 을 참조하십시오 . 아래의 답변은 여전히 ​​작동 할 수 있지만 다른 브라우저에서 일부 오 탐지를 유발할 수 있습니다.

var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

그러나 언급 한 바와 같이 사용자 에이전트는 스푸핑 될 수 있으므로 다른 답변에서 언급 했듯이 이러한 문제를 처리 할 때 항상 기능 감지 (예 : Modernizer ) 를 사용하는 것이 가장 좋습니다 .


.toLowerCase를 사용하는 이유는 무엇입니까? 왜 navigator.userAgent.indexOf ( 'Chrome') 많은 사람들이 그것을 사용하지만 요점을 잘 모르는 이유는 무엇입니까?
Jon

7
@Serg에는 Chrome이 없기 때문에. iOS Safari 주변의 스킨입니다.
Poetro

2
감사합니다, 당신의 var 이름은 camelCase
Dimitri Kopriwa

5
많은 브라우저가 이것에 true를 반환하기 때문에 Edge, Maxthon, iOS 사파리 등을 제외하고 사용한 코드는 다음과 같습니다 var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.

2
오페라 (적어도 버전 42) 반환 Google Incnavigator.vendor이 방법은 방탄되지 않도록, 같은 일이 /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)아마 더 잘 작동 것
yorch

314

브라우저가 Chrome 인지 확인하려면 다음을 시도하십시오.

// please note, 
// that IE11 now returns undefined again for window.chrome
// and new Opera 30 outputs true for window.chrome
// but needs to check if window.opr is not undefined
// and new IE Edge outputs to true now for window.chrome
// and if not iOS Chrome check
// so use the below updated condition
var isChromium = window.chrome;
var winNav = window.navigator;
var vendorName = winNav.vendor;
var isOpera = typeof window.opr !== "undefined";
var isIEedge = winNav.userAgent.indexOf("Edge") > -1;
var isIOSChrome = winNav.userAgent.match("CriOS");

if (isIOSChrome) {
   // is Google Chrome on IOS
} else if(
  isChromium !== null &&
  typeof isChromium !== "undefined" &&
  vendorName === "Google Inc." &&
  isOpera === false &&
  isIEedge === false
) {
   // is Google Chrome
} else { 
   // not Google Chrome 
}

사용 예 : http://codepen.io/jonathan/pen/WpQELR

Chrome 관리자를 사용하고 콘솔 탭으로 이동하면 이것이 작동하는 이유입니다. 'window'를 입력하고 Enter를 누르십시오. 그런 다음 '창 개체'에 대한 DOM 속성을 볼 수 있습니다. 객체를 축소하면 'chrome'속성을 포함한 모든 속성을 볼 수 있습니다.

더 이상 IE를 확인하기 위해 equals를 true로 사용할 수 없습니다 window.chrome. IE는 돌아 왔지만 undefined이제는 돌려줍니다 true. 그러나 IE11은 이제 undefined를 다시 반환합니다. IE11은 빈 문자열을 반환 ""를 들어 window.navigator.vendor.

이게 도움이 되길 바란다!

최신 정보:

아래를 지적 해 주신 Halcyon991 에게 감사드립니다 . 새로운 Opera 18+도 true로 출력됩니다 window.chrome. 과 같은 오페라 18 을 기반으로 크롬 (31) . 그래서 window.navigator.vendoris is "Google Inc"and not is 확인하는 검사를 추가했습니다 "Opera Software ASA". 또한 RingAdrien Be 덕분 에 Chrome 33이 더 이상 true를 반환하지 않는 것에 대해 알려 드리겠습니다. window.chrome이제 null이 아닌지 확인합니다. 그러나 IE11에 세심한주의를 기울이면서 IE11이 처음 릴리스되었을 때와 같이 undefined출력 이후로 다시 확인을 추가 undefined했습니다. 그런 다음 일부 업데이트 빌드 후에 ..로 출력되었습니다 true. 이제 최근 업데이트 빌드가 undefined다시 출력 됩니다. Microsoft는 마음을 만들 수 없습니다!

2015 년 7 월 24 일 업데이트 -Opera check 추가

오페라 30이 막 출시되었습니다. 더 이상 출력되지 않습니다 window.opera. 또한 window.chrome새로운 Opera 30 에서도 true로 출력됩니다. 따라서 OPRuserAgent 에 있는지 확인해야합니다 . Chrome 30과 동일한 렌더 엔진을 사용하기 때문에 Opera 30의 새로운 변경 사항을 설명하기 위해 위의 조건을 업데이트했습니다.

2015 년 10 월 13 일 업데이트 -IE 확인 추가

그것으로 인해 출력에 IE 에지 검사를 추가 true위해 window.chrome비록 IE11 출력 .. undefined대한 window.chrome. 이에 대해 알려 주신 artfulhacker 에게 감사드립니다 !

업데이트 2/5/ 2016-iOS Chrome 확인 추가

iOS에서 Chrome CriOS을 출력 true하기 때문에 iOS Chrome 검사를 추가 했습니다 . 이에 대해 알려 주신 xinthose 에게 감사드립니다 !

2018 년 4 월 18 일 업데이트 -Opera 점검 변경

Chrome 66 에 포함 된 Opera 확인 기능 window.opr이 수정 되었습니다 . 덕분에 서리가 내린 Z다니엘 Wallman 이를보고!undefinedOPRwindow.navigator.vendor


IE10에서는 작동하지 않습니다. 대해서 typeof는 IE10 반환 {목적}에 window.chrome
마그리트

2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Ring

1
감사합니다 @xinthose .. 방금 IOS Chrome 확인을 추가했습니다 .. 대단히 감사합니다! :)
Jonathan Marzullo

2
여기 Daniel Wallman과 같은 문제 일 수 있습니다. Android Chrome 사용자 에이전트에 "OPR"문자열이 포함되어 있습니다. Mozilla/5.0 (Linux; Android 8.0.0; ASUS_Z012D Build/OPR1.170623.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36따라서 false를isChrome() 반환합니다 .
Frosty Z

2
@FrostyZ와 @DanielWallman에게 알려 주셔서 감사합니다. Opera가 확인 window.opr하지 않도록 수정했습니다 undefined.
Jonathan Marzullo


16

훨씬 간단한 해결책은 다음과 같습니다.

var isChrome = !!window.chrome;

!!단지 부울 값으로 개체를 변환합니다. Chrome 이외의 브라우저에서이 속성은 undefined입니다.

Chrome을 기반으로하는 Edge 버전에서도 마찬가지입니다 (@Carrm 덕분에 지적했습니다).


5
오페라는 실제로 반환 truewindow.chrome. 방탄 감지 + 수정 기능이있는 conditionizr.com을 확인하십시오.
Halcyon991

7
오페라는 기본적으로 크롬입니다
Karel Bílek

나는 왜 두 번 이해가되지 않습니다! if (chrome) {}
Vishal Sharma

3
@vishalsharma, !!값을 true또는 로 변환합니다 false. typeof(window.chrome)제공 "object"하지만, typeof(!!window.chrome)제공합니다 "boolean". if명령문이 변환을 수행 하기 때문에 코드 샘플도 작동합니다 .
Drew Noakes

1
trueEdge 도 반환 합니다.
Carrm September

14

console.log(JSON.stringify({
  isAndroid: /Android/.test(navigator.userAgent),
  isCordova: !!window.cordova,
  isEdge: /Edge/.test(navigator.userAgent),
  isFirefox: /Firefox/.test(navigator.userAgent),
  isChrome: /Google Inc/.test(navigator.vendor),
  isChromeIOS: /CriOS/.test(navigator.userAgent),
  isChromiumBased: !!window.chrome && !/Edge/.test(navigator.userAgent),
  isIE: /Trident/.test(navigator.userAgent),
  isIOS: /(iPhone|iPad|iPod)/.test(navigator.platform),
  isOpera: /OPR/.test(navigator.userAgent),
  isSafari: /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent),
  isTouchScreen: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
  isWebComponentsSupported: 'registerElement' in document && 'import' in document.createElement('link') && 'content' in document.createElement('template')
}, null, '  '));


불행히도 navigator.vendor === "Google Inc." Opera에서 (최소 v.49) 코드 Opera를 사용하면 Chrome으로 표시됩니다.
Wojtek Majerski

9
세계 어딘가에 우리가 실제로 필요로하지 않는 모든 정규 표현식에 대해 새끼 고양이가 죽습니다.
Sz.

설명이없고, 오 탐지 / 음수에 대한 표시가없고, 여기에 덤프 된 코드 만 있습니다 ...이 응답은 실제로 하향 조정되어야합니다. 그것은 묻는 질문에 대한 답변조차 아닙니다.
Alexandre Germain

8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );

3
이 작업이 마음에 들었습니다. var is_chrome = /chrome/i.test(navigator.userAgent); 너무
AlanFoster

14
trueMicrosoft Edge에서 반환합니다 .
Cobby

@Cobby : 모든면에서 Edge는 당시 릴리스되지 않았습니다. 정보 주셔서 감사합니다 :)
naveen

3

특정 버전의 Chrome을 원할 수도 있습니다.

var ua = navigator.userAgent;
if(/chrome/i.test(ua)) {
    var uaArray = ua.split(' ')
    ,   version = uaArray[uaArray.length - 2].substr(7);
}

내 답변을 사용하여 Big Lebowski에게 사과드립니다.


4
버전은 "537.36"Microsoft Edge에 있습니다.
Cobby

3

당신이 사용할 수있는:

navigator.userAgent.indexOf("Chrome") != -1

v.71에서 작업 중입니다.


navigator.userAgent.includes("Chrome")
Alex Szücs

2

Mac 용 Chrome에서 작동합니다. 위의 모든 것보다 더 간단하거나 신뢰할 수있는 것 같습니다 (userAgent 문자열이 테스트 된 경우).

        var isChrome = false;
        if (window.chrome && !window.opr){
            isChrome = true;
        }
        console.log(isChrome);

2
const isChrome = window.chrome && !window.opr;
ifeelbadformyoldquestions

1

사용자는 사용자 에이전트를 변경할 수 있습니다. 요소의 객체 webkit에서 접두사 속성을 테스트하십시오.stylebody

if ("webkitAppearance" in document.body.style) {
  // do stuff
}

1
파이어 폭스에서 : (document.body.style의 "webkitAnimation") === true
Tomas Prado

3
참고 : 'webkitAppearance'도 더 이상 작동하지 않습니다. Edge가 이제 그것을 사용하고 있습니다. 아마도 답변을 삭제하는 것이 가장 좋습니다. ^^
hexalys


0

다른 데스크탑 브라우저 (Firefox, IE, Opera, Edge, Chrome)의 이름을 알기 위해 사파리 제외.

function getBrowserName() {
  var browserName = '';
  var userAgent = navigator.userAgent;
  (typeof InstallTrigger !== 'undefined') && (browserName = 'Firefox');
  ( /* @cc_on!@*/ false || !!document.documentMode) && (browserName = 'IE');
  (!!window.chrome && userAgent.match(/OPR/)) && (browserName = 'Opera');
  (!!window.chrome && userAgent.match(/Edge/)) && (browserName = 'Edge');
  (!!window.chrome && !userAgent.match(/(OPR|Edge)/)) && (browserName = 'Chrome');

  /**
   * Expected returns
   * Firefox, Opera, Edge, Chrome
   */
  return browserName;
}

다음 브라우저 버전에서 작동합니다.

Opera - 58.0.3135.79
Firefox - 65.0.2 (64-bit)
IE - 11.413.15063 (JS Fiddle no longer supports IE just paste in Console)
Edge - 44.17763.1.0
Chrome - 72.0.3626.121 (Official Build) (64-bit)

여기서 요점 과 여기 에서 바이올린을 보십시오.

원래 코드 스 니펫은 더 이상 Chrome에서 작동하지 않았으며 찾은 위치를 잊었습니다. 그것은 전에 사파리를 가졌지 만 더 이상 사파리에 액세스 할 수 없으므로 더 이상 확인할 수 없습니다.

Firefox 및 IE 코드 만 원래 스 니펫의 일부였습니다.

Opera, Edge 및 Chrome 검사는 간단합니다. userAgent에 차이가 있습니다. OPROpera에만 존재합니다. EdgeEdge에만 존재합니다. 따라서 Chrome을 확인하려면 이러한 문자열이 없어야합니다.

파이어 폭스와 IE는 그들이 무엇을하는지 설명 할 수 없습니다.

내가 쓰고 있는 패키지 에이 기능을 추가 할 것이다


-4

모든 답변이 잘못되었습니다. "Opera"와 "Chrome"은 모든 경우에 동일합니다.

(편집 된 부분)

여기에 정답이 있습니다

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}

1
답변보다 더 나은 의견.
Jace Cotton

왜 당신이 무너 졌는지 궁금하다면, 이것은 사실이 아닙니다. 예를 들어 키보드 단축키를 처리하고 키 수정 자에 다르게 액세스합니다 (기능 감지도 불가능).
Zilk

'오페라'와 '크롬'은 동일한 브라우저 전용 아이콘이 아니라고 말하지 않습니다. 위에서 설명한 방법은 두 브라우저 모두에 대해 동일한 결과를 제공한다고 말합니다.
Ararat Harutyunyan

@Zilk 예를 들어 66 표를 얻은 첫 번째 답변을 테스트 했습니까?
Ararat Harutyunyan

9
크롬 71에서 더 이상 작동하지 않습니다. window.chrome.webstore현재undefined
Esteban
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.