2010-02-04 3 views

답변

31

조건부 의견은 좋은 대안 :

<!--[if IE 6]> 
<script> 
var everythingIsBroken = true; 
</script> 
<![endif]--> 

편집 : 당신은 여전히 ​​2017 년 이후에 IE 6을 지원하기 위해 찾고 있다면. .. 내 마음이 너에게 간다. 2017 년이 질문에 대한 대답은 IE 6을 걱정하지 않아도됩니다. 더 이상 지원되는 브라우저가 아닙니다. 이 브라우저 및 브라우저 자체를 실행할 수있는 운영 체제는 더 이상 보안 업데이트를받지 못합니다. 즉,이 소프트웨어를 사용하는 사용자는 악용 될 위험이 있습니다. 이는 업그레이드 할 여력이없는 사람들에게 큰 문제입니다.

+0

이것은 심각한 대답입니까? – TIMEX

+7

해야합니다.조건부 주석은 특정 버전의 IE에서만 특정 코드를 실행하는 방법으로 Microsoft에서 도입 한 것입니다. HTML 주석에 있기 때문에 다른 브라우저에서는 무시합니다. – Aistina

+2

조건부 주석은 실행 가능한 대안이 아닙니다. Internet Explorer에서 직접 작동하지만 WebBrowser 컨트롤을 사용하면 다른 유사한 브라우저에서 사용할 수 없게됩니다. 어떤 경우에는 귀하의 조건부 주석이 쓸모 없게됩니다. Trident4 엔진을 사용하는 대부분의 타사 브라우저에는 조건부 주석이 해제되어 있습니다. –

6
var ua = window.navigator.userAgent; 
    var msie = ua.indexOf ("MSIE "); 

    if (msie > 0)  // If Internet Explorer, return version number 
    return parseInt (ua.substring (msie+5, ua.indexOf (".", msie))); 
    else     // If another browser, return 0 
    return 0; 

출처 : http://support.microsoft.com/kb/167820

+1

-1 : 사용자 에이전트를 사용하여 브라우저를 식별하지 마십시오. 대신 기능 기반 탐지를 사용하십시오. –

+0

이유는 무엇입니까? 그것은 IE, FF와 크롬 위에서 멋지다! –

+0

@Yassir : MSIE 6과 동일한 엔진 (Trident 4)을 사용하는 많은 브라우저가 있습니다. 기능 감지와 사용자 에이전트 검색을 사용하면 이러한 기능을 포착합니다. 또한 사용자 에이전트 검색보다 오탐 (false positive)이 적습니다 (많은 브라우저에는 UA를 다른 브라우저로 전달할 수있는 옵션이 있습니다). –

5

는 사용자 에이전트에 대한 당신의 탐지를 기반으로하지 마십시오. 트라이던트 4 엔진 (하나의 IE6 사용)은 IE6이 아닌 다른 많은 브라우저가 있습니다.

대답은 간단하다 : 엔진을 감지의 브라우저를 감지하지 않습니다. 이를 수행하려면 기능 기반 탐지을 사용해야합니다.

  • 대상보다 더 비슷한 렌더링 엔진을 사용하여 모든 브라우저를 감지 : 기능 기반 탐지를 사용


    는 다음과 같은 장점이 있습니다. 렌더링 엔진의 문제를 피해 갈 분기

  • 쉬운 코드.
  • 미만 가양는 (사용 도구가 기능 할 수없는 다른 브라우저로 전달하도록 변형 될 수있다).

다음 스크립트 엔진을 감지하는 브라우저 기능을 사용합니다. MooTools 프로덕션 팀 (http://mootools.net/developers/)에게 기부하십시오.

참고 : 아래의 조각은 MooTools 자바 스크립트 프레임 워크없이 작동하도록 수정되었습니다. MooTools으로 작업하려면이 코드가 더 이상 필요하지 않으며 배포판의 일부입니다.

function $tryCatch(){ 
    for (var i = 0, l = arguments.length; i < l; i++){ 
     try { 
      return arguments[i](); 
     } catch(e){} 
    } 
    return null; 
}; 

var Browser = { 

    Engine: {name: 'unknown', version: 0}, 

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, 

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, 

    Plugins: {}, 

    Engines: { 

     presto: function(){ 
      return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); 
     }, 

     trident: function(){ 
      return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); 
     }, 

     webkit: function(){ 
      return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); 
     }, 

     gecko: function(){ 
      return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); 
     } 

    } 

}; 

Browser.Platform[Browser.Platform.name] = true; 

Browser.detect = function(){ 

    for (var engine in this.Engines){ 
     var version = this.Engines[engine](); 
     if (version){ 
      this.Engine = {name: engine, version: version}; 
      this.Engine[engine] = this.Engine[engine + version] = true; 
      break; 
     } 
    } 

    return {name: engine, version: version}; 

}; 

Browser.detect(); 

Browser.Request = function(){ 
    return $tryCatch(function(){ 
     return new XMLHttpRequest(); 
    }, function(){ 
     return new ActiveXObject('MSXML2.XMLHTTP'); 
    }, function(){ 
     return new ActiveXObject('Microsoft.XMLHTTP'); 
    }); 
}; 

Browser.Features.xhr = !!(Browser.Request()); 

Browser.Plugins.Flash = (function(){ 
    var version = ($tryCatch(function(){ 
     return navigator.plugins['Shockwave Flash'].description; 
    }, function(){ 
     return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); 
    }) || '0 r0').match(/\d+/g); 
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; 
})(); 

function $exec(text){ 
    if (!text) return text; 
    if (window.execScript){ 
     window.execScript(text); 
    } else { 
     var script = document.createElement('script'); 
     script.setAttribute('type', 'text/javascript'); 
     script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; 
     document.head.appendChild(script); 
     document.head.removeChild(script); 
    } 
    return text; 
}; 

그냥이 자바 스크립트 클래스를 포함하면 감지 할 수 IE6 및 수행하여 Trident4 엔진을 사용하여 다른 브라우저 다음

if(Browser.Engine.trident4) { 
    alert('IE6 or similar...'); 
} elseif(Browser.Engine.name == "trident") { 
    alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version); 
} 
+2

이것은이 질문에 대한 다른 답변에 대한 귀하의 의견에서 추천하는 기능 감지와 같지 않습니다. –

+0

@Tim Down : 기능 감지가 아닌 ** ** 탐지를 기반으로했습니다. 기능 기반 검색은 특정 렌더링 엔진의 JavaScript 엔진에 구현 된 기능을 기반으로 ** 엔진 **을 식별하려고했습니다. 기능 감지 기능을 사용하면 지원되는 것으로 감지 된 기능을 기반으로 기능을 켜거나 끌 수 있습니다. 페이지를 렌더링하는 데 사용 된 엔진을 알면 해당 페이지의 동적 요소 렌더링과 함께 단점을 수정할 수 있습니다. 이 방법을 객체 기반 탐지라고도합니다. –

+4

이것은 기능 추론이며 벗겨지기 쉽습니다. 어떤 추측은'document.getBoxObjectFor' 또는'window.mozInnerScreenX' 또는'navigator.taintEnabled'의 존재를 바탕으로 만들어야합니까? 이 객체를 테스트 할 객체와 관련이없는 동작을 다양하게하기 위해 사용하려는 경우 userAgent 문자열을 살펴 보는 것만으로도 충분합니다. 이러한 객체는 JavaScript로 덮어 쓸 수 있으며 일반적으로 비표준이므로 브라우저 제조사의 변덕에 노출 될 수 있습니다. MooTools는 최근 (http://ajaxian.com/archives/mootools-call-to-upgrade)에 찔렸습니다. –

1

무엇 사용 <browser_x>을 감지하는 가장 좋은 방법은 자바 스크립트? 하지 않음으로써

.

으로 앤드류 무어는이 게시물의 댓글에서 언급 한, 당신은 특징 검출을 사용한다. 이렇게하면 코드가 "미래를 보장"합니다.나중에 다른 브라우저가 기능을 지원하거나 더 이상 지원하지 않으면 코드가 안전합니다. 이 사이트를 처리하는 방법을 설명하는 여러 사이트가 있습니다.

+0

특정 브라우저 버전에서 렌더링 버그가 있다고 가정 해 봅시다. 해당 브라우저 및 버전에 대한 대안 만 타겟팅하십시오 (예 : 투명한 배경이 버튼 등에 잘못 렌더링된다고 가정 해 봅시다). 이 시나리오에서는 기능 감지와 같은 기능이 없습니다. 렌더링 버그를 "감지"할 수는 없습니다. 실제 세계에서는 브라우저의 모든 특질이 기능 감지 될 수있는 것은 아니며, 브라우저 감지에 대해 묻는 사람들은 자신보다 지식이 부족하거나 그렇게할만한 이유가 없다고 생각할 수 없습니다. – thomasrutter

+0

@thomasrutter 모든 렌더링 버그가 기능 감지에 불가능하지는 않습니다. 그러나 일반적으로 렌더링 버그는 브라우저 관련 JavaScript와는 별도로 자체 전략 집합이있는 CSS 문제입니다. 이 질문은 * JavaScript *에 대해 정확히 묻는 것이 었습니다. * JavaScript *는 올바르게 작성된 경우 거의 브라우저 탐지가 필요하지 않습니다. 묻는 사람은 브라우저 탐지를 원한 이유에 대해 구체적이지 않았으며 이미 여기에 언급 된 충분한 IE6 탐지 전략이 있습니다. 나는 묻는 사람이 알지 못했을 수도있는 대안을 제시했는데, 그 대안은 90 %의 경우에 효과적 일 것입니다. –

+0

2 년 전에 작성한 게시물에 대한 새로운 댓글에 답장 해 주신 것을 감동했습니다. :) – thomasrutter

0

IE 6을 감지하려는 특별한 이유가 있는지 잘 모르겠지만 일반적으로 브라우저를 감지하는 대신 브라우저의 기능을 감지하는 것이 좋습니다. jQuery.support : http://api.jquery.com/jQuery.support/을 사용하여 JQuery로 쉽게이 작업을 수행 할 수 있습니다. 실제로 (아스 커는 특히 IE6를 감지 할 좋은 이유가 있고 잠시 동안 가정) 요청 된 질문에 대답의 위험에서

+2

간단한 문제를 해결하기 위해 대규모 JavaScript 라이브러리 또는 프레임 워크를 사용하는 것이 좋습니다. 해결책의 종류? –

+0

나는 jQuery를 "방대한"이라고 부르지 않을 것이다. 포스터가 어떻게해야하는지 묻는 것은 꽤 많이 행해져서는 안되는 것이므로 더 가치있는 조언이 그 이유와 그/그녀가해야 할 일이 무엇인지에 따라 훌륭한 프로그래밍 실습을 따를 수 있습니다. – jhchen

26

:

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) { 
    // yep, browser claims to be IE6 
} 
+9

+1 사실 실제로 질문에 대답하고 기능 탐지가 사용되어야하는 이유에 대해 호언 장담하지 않으면 브라우저 탐지가 일부 경우에 여전히 유효합니다. – Lightweight

+3

기능 탐지는 실제로 기능 탐지가 원하는 기능 일 때 바람직합니다 (브라우저 탐지에 대해 사람들이 묻는 대부분의 경우). 그러나 특정 브라우저 버전의 버그에 대한 해결 방법을 적용해야하는 경우 기능 감지는 종종 불가능합니다 (예 : 렌더링 버그 일 수 있으므로 "감지"할 수 없음). 사용자 에이전트를 기반으로 브라우저 검색을 사용하는 경우 정규 표현식이 버그가있는 특정 버전 만 대상으로하고 미래 버전은 대상으로 삼지 않도록해야합니다. 그렇지 않으면 브라우저의 이후 버전에서 버그가 "수정"됩니다. – thomasrutter

+0

이 정보를 검색하는 내 이유는 이미 Internet Explorer와 같은 형식으로 된 HTC 파일에서 IE6를 검색하는 것이지만 IE6과 IE8, 9, 10, 11, 12는 CSS를 수정하지 않아도됩니다. 질문에 대한 귀하의 대답도 내 질문에 대한 답변입니다. 나는 IE 브라우저가 표준에 맞춰진 세계에있는 것을 좋아할 것이다. 그러나 나는 그렇지 않다. 그리고 그 사용자에게 결함이있는 페이지를 제공하는 것은 내가 일하는 브랜드를 대표하지 않는다. 좋든 나쁘 든, (주로) 나쁘다. 나는 IE를 다루어야한다. – Wayne

2

매우 늦게 또한. apphacker's answer에 사용되는 HTML 조건부 주석에 추가

, 마이크로 소프트의 JScript 구현은 conditional comments for JavaScript 제공 :

<script type="text/javascript"> 
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)[email protected]@*/0/*@[email protected]*/; 

    if (isIE6) { 
     alert("You're screwed"); 
    } 
</script> 

좋은 점은 외부 자바 스크립트 파일 (.js)에서 사용할 수 있다는 것입니다. 마이크로 소프트의 호스트 응용 프로그램에 의해 구현되는 JScript의 버전을 나열하는 테이블의 경우

: JavaScript Version Information

+0

기술적으로 조건부 주석이 아닙니다. 조건부 컴파일이라고하며 별도의 메커니즘입니다. JScript를 브라우저와 독립적으로 업그레이드 할 수 있기 때문에이를 사용하여 실행중인 IE의 버전을 정확하게 검색하는 것도 불가능합니다. –

3

이 작업을 수행하는 가장 신뢰할 수있는 방법은 @apphacker에서 언급 한 바와 같이, 조건부 주석을 사용하는 것입니다. 그러나 겉으로 덜 알려진 뭔가 조건부 주석이 자바 스크립트에서 사용할 수 있다는 것입니다 :

var div = document.createElement("div"); 
div.innerHTML = "<!--[if IE 6]><i></i><![endif]-->"; 
var isIe6 = (div.getElementsByTagName("i").length == 1); 

alert("Is IE 6: " + isIe6); 
0
<!--[if (IE 6)|(IE 7)]> 
<script> 
    alert("Lesser browser detected!"); 
</script> 
<![endif]--> 
관련 문제