Javascript로 Google Chrome을 감지하는 안전한 기능 기반 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/81099

문제

제목에서 알 수 있듯이 Google Chrome을 감지하는 안전한 기능 기반(즉, navigator.appName 또는 navigator.appVersion을 사용하지 않음) 방법을 찾고 싶습니다.

기능 기반이란 예를 들어 다음과 같습니다.

if(window.ActiveXObject) {
    // internet explorer!
}

편집하다: 지적했듯이 질문은 별로 의미가 없습니다(분명히 기능을 구현하려면 테스트하고, 특정 브라우저를 감지하려면 사용자 에이전트를 확인하세요). 죄송합니다. 오전 5시입니다. ;) 다음과 같이 표현하겠습니다.Chrome 고유의 자바스크립트 개체 및/또는 기능이 있습니까?

도움이 되었습니까?

해결책

isChrome = function() {
    return Boolean(window.chrome);
}

다른 팁

이 답변은 매우 구식입니다, 하지만 그 당시 석기 시대에는 매우 관련성이 높았습니다.

Opera 모호함을 검색한 것처럼 기능 감지가 navigator.userAgent 구문 분석보다 더 유용하다고 생각합니다. 여기.IE16이 /MSIE 16.0;/ 정규 표현식을 구문 분석할지 여부는 아무도 알 수 없습니다. 하지만 document.all 지원이 있을 것이라는 점은 확신할 수 있습니다.실제 생활에서 기능은 일반적으로 다음과 같이 브라우저와 동의어입니다. "XMLHttpRequest가 없나요?그것은 f...d IE6입니다!"IE 이외의 브라우저는 document.all을 지원하지 않지만 Maxthon과 같은 일부 브라우저는 userAgent를 뒤섞을 수 있습니다.(물론 스크립트는 어떤 이유로 Firefox에서 document.all을 정의할 수 있지만 쉽게 제어할 수 있습니다.) 따라서 저는 이 솔루션을 제안합니다.

편집하다 여기 완전한 자료를 찾았습니다.

편집 2 나는 document.all이 Opera에서도 지원되는지 테스트했습니다!

var is = {
  ff: window.globalStorage,
  ie: document.all && !window.opera,
  ie6: !window.XMLHttpRequest,
  ie7: document.all && window.XMLHttpRequest && !XDomainRequest && !window.opera,
  ie8: document.documentMode==8,
  opera: Boolean(window.opera),
  chrome: Boolean(window.chrome),
  safari: window.getComputedStyle && !window.globalStorage && !window.opera
}

사용은 간단합니다:

if(is.ie6) { ... }

질문에 대한 정확한 답변은 아니지만..그러나 특정 브라우저 브랜드를 검색하려는 경우 기능 확인의 요점이 상실됩니다.다른 브라우저가 Chrome userAgent 문자열을 사용하고 있는지 의심스럽습니다. 따라서 '이 브라우저가 Chrome인가요?'라는 질문이 있는 경우 해당 브라우저만 살펴봐야 합니다.(그런데, window.ActiveXObject는 IE를 보장하지 않으며, 이 개체를 제공하는 다른 브라우저용 플러그인이 있습니다.내가 말하려고 했던 요점을 어떤 종류로 설명하는가?)

모든 표준 나치에 대해 ...때로는 아직 표준은 아니지만 표준이 될 수 있는 "표준 기술"을 사용하고 싶을 수도 있습니다.CSS3 기능과 같은.

제가 이 페이지를 찾은 이유가 바로 이것입니다.

어떤 이유로 Safari는 테두리 반경과 상자 그림자의 조합을 제대로 실행하지만 크롬은 조합을 올바르게 렌더링하지 않습니다.그래서 조합을 비활성화하는 웹킷인데도 크롬을 감지할 수 있는 방법을 찾아보면 좋을 것 같습니다.

나는 특정 브라우저/버전을 감지해야 하는 수백 가지 이유에 부딪쳤는데, 이는 일반적으로 내가 하고 싶은 일이 큰 악의 지원을 받지 않기 때문에 멋진 기능에 대한 아이디어를 폐기하게 됩니다...

그러나 때로는 일부 기능이 아직 표준화되지 않았더라도 사용하지 않는 것이 너무 멋진 경우도 있습니다.

따라서 Marijn의 주장을 받아들이고 ~이다 javascript를 통해 사용자 에이전트 문자열을 테스트하는 데 관심이 있습니다.

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

(신용: http://davidwalsh.name/Detecting-google-chrome-javascript )


다음은 Chrome 사용자 에이전트 문자열에 대한 정말 훌륭한 분석/분석입니다. http://www.simonwhatley.co.uk/whats-in-google-chromes-user-agent-string

나는 행동/능력 탐지를 자주 사용합니다.브라우저 이름(사용자 에이전트)을 기반으로 문제를 해결하는 대신 문제를 해결하기 전에 브라우저가 기능을 지원하는지 직접 확인하세요.

브라우저별 해결 방법의 문제점은 버그가 수정되었는지 또는 해당 기능이 현재 지원되는지 알 수 없다는 것입니다.기능 감지를 수행하면 알다 브라우저는 그것을 직접적으로 지원하거나 지원하지 않으며, 당신은 단지 브라우저주의자가 아닙니다.

http://diveintohtml5.ep.io/everything.html

특별히 Chrome을 감지해서는 안 됩니다.페이지 렌더링에 관한 한 Chrome은 다른 WebKit 브라우저(Safari, Epiphany)와 똑같이 작동해야 하므로 WebKit을 감지해야 합니다.

WebKit을 감지할 뿐만 아니라 정확히 어떤 버전이 사용되고 있는지 확인해야 하는 경우 다음 링크를 참조하세요. http://trac.webkit.org/wiki/DetectingWebKit

하지만 위에서도 다른 사람들이 말했듯이 브라우저를 감지해서는 안 되며 기능을 감지해야 합니다.이에 대한 자세한 내용은 이 ADC 문서를 참조하세요. http://developer.apple.com/internet/webcontent/objectDetection.html

브라우저가 Chrome인지 알아야 할 한 가지 이유는 그것이 표준을 너무 '준수'하기 때문입니다.나는 이미 표준을 준수한다고 생각했던 오래된 JavaScript 코드(FF 또는 Opera 표준에 따라 매우 훌륭함)에 문제가 발생했지만 Chrome은 훨씬 더 까다롭습니다.이로 인해 일부 코드를 다시 작성해야 했지만 때로는 if(isChrome) { 어쩌구... 어쩌구 ) 트릭을 사용하여 실행하는 것이 더 쉬울 수도 있습니다.Chrome은 매우 잘 작동하는 것 같지만(저는 표준 준수를 원합니다) 때로는 사용자가 무엇을 실행하고 있는지 아주 자세히 알아야 할 때도 있습니다.

또한 Chrome은 매우 빠릅니다.문제는 일부 JavaScript 코드가 의도치 않게 다른 브라우저의 속도 저하에 따라 제대로 작동한다는 것입니다. 즉, 다음과 같습니다.페이지 로딩, iframe 로딩, 페이지 헤드에 스타일시트 링크 및 자바스크립트 링크 배치 등이는 페이지 요소와 상호 작용하는 데 실제로 기능을 사용할 수 있는 경우 새로운 문제를 일으킬 수 있습니다.따라서 지금은 정말로 알아야 할 수도 있습니다 ...

나는 이 코드를 사용하여 각 브라우저에 대한 북마크를 만듭니다(또는 웹킷에 대한 메시지를 표시합니다).

if (window.sidebar) { 
// Mozilla Firefox Bookmark
window.sidebar.addPanel(title, url,"");
} else if( window.external ) { // IE Favorite
  if(window.ActiveXObject) {
  //ie
  window.external.AddFavorite( url, title);
  } else {
  //chrome
  alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok');
  }
} else if(window.opera && window.print) { 
// Opera
  return true; }
 else { //safri
 alert('Press ctrl+D to bookmark (Command+D for macs) after you click Ok'); }

Opera에도 오류가 있으므로 오탐이 있을 수 있습니다. window.chrome 물체.나는 좋은 솔루션으로 사용합니다.

var isOpera = !!window.opera || !!window.opr;// Opera 8.0+

var isChrome = !!window.chrome && !isOpera;

이 솔루션은 거의 항상 작동합니다.그런데 제가 발견한 사실 중 하나는, isChrome 보고 false iPad Chrome 버전 52.0에서 window.chrome 보고 false.

IIE:!!(!window.addEventListener && window.ActiveXObject),

isIE6:typeof document.createElement('DIV').style.maxHeight == "정의되지 않음",

isIE7:!!(!window.addEventListener && window.XMLHttpRequest && !document.querySelectorAll),

isIE8:!!(!window.addEventListener && document.querySelectorAll && document.documentMode == 8),

isGecko:navigator.product == '게코',

isOpera:!!window.opera,

isChrome:!!window.chrome,

isWebkit:!!(!window.opera && !navigator.taintEnable && document.evaluate && navigator.product != 'Gecko'),

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top