최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

   1. 브라우저 종류 판별


여러가지 방법이 있지만 현재 (2014.07월) 까지 대다수 브라우저와 특히 IE계열 7,8,9,10,11을 판별 해 내는 간단한 함수를 만들어보고

 

IE의 경우 프론트엔드 개발자를 지독하게 괴롭히는 호환성 보기 체크 여부까지 검사하는 방법을 알아보겠다.

 

 

   2. IE버전을 구분 할 때에는 navigator.appName을 사용하지 말것

 

예전에는 IE의 경우 최초 navigator.appName 메서드로 접근하여 "Microsoft Internet Explorer" 라는 문자열로 알 수 있었는데

 

IE11의 경우 navigator.appName 이름이 Netscape로 나온다. 쌩뚱맞게 Netscape로 나오는 이유는? -> 본인도 모르겠다.

 

표로 정리)

 IE 버전

navigator.appName

 11

Netscape

 10

Microsoft Internet Explorer

 9

Microsoft Internet Explorer

 8

Microsoft Internet Explorer

 7

Microsoft Internet Explorer



   3. IE버전을 구분 할 때에는 MSIE를 사용하지 말것


navigator.userAgent 의 반환값 중에 MSIE를 indexOf로 조회하여 그 값으로 구분하거나 판별했다면 다음과 같은 중요한 문제가있다.

 

'IE 11버전 부터 더이상 navigator.userAgent에 MSIE가 포함되어있지 않으므로 MSIE 토큰으로는 버전 판별 불가.'

 

이 말은 IE 11의 에이전트에는 MSIE 토큰이 없고 대신 rv:11.0 으로 표시 되어있다.

 

// IE 11

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; rv:11.0) like Gecko

 

불과 IE 10 까지의 에이전트에는 MSIE 버전이 표기되어 있었다.

 

//IE 10

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0

 

정리하자면 8부터는 Trident로 표기하기 시작했음을 알 수 있다.

 

 

   4. 결론. IE는 Trident 토큰으로 판별해야 한다.
 

앞으로는 Trident토큰으로 IE의 버전을 체크해야한다. IE6은 제외하겠다..

 

표로 정리)

 IE 버전

 trident

 11

 7.0

 10

 6.0

 9

5.0

 8

 4.0

 7

 null



   소스 적용


13~21 : 각 브라우저의 에이전트 정보 중에서 "trident" 문자열을 확인한뒤 조건문으로 검사한다.

 

           4번의 표를 기준으로 각 버전을 알 수 있다. (11,10,9,8)

 

24 : 애석하게도 IE 7은 trident 값이 없으니..

 

      ㄱ. navigator.appName == 'Microsoft Internet Explorer' 으로 검사하거나

 

      ㄴ. 주석 처리된 27 ~ 29번 라인처럼 기존 MSIE를 검사하여 값이 7 이하로 떨어지면 IE 7 이하가 맞다. 6은 버렸다.

 

33 : 이외에 나머지 브라우저는 에이전트 정보를 모두 소문자로 바꾼뒤 고유의 스트링 네임으로 indexOf 해주면 된다.

 


<!DOCTYPE HTML>
<html lang="ko">
<head>
<title> serpiko's browser-userAgent </title>
<meta charset="utf-8">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
    function getBrowserType(){
         
        var _ua = navigator.userAgent;
        var rv = -1;
		
		//IE 11,10,9,8
		var trident = _ua.match(/Trident\/(\d.\d)/i);
		if( trident != null )
		{
			if( trident[1] == "7.0" ) return rv = "IE" + 11;
			if( trident[1] == "6.0" ) return rv = "IE" + 10;
			if( trident[1] == "5.0" ) return rv = "IE" + 9;
			if( trident[1] == "4.0" ) return rv = "IE" + 8;
		}
		
		//IE 7...
		if( navigator.appName == 'Microsoft Internet Explorer' ) return rv = "IE" + 7;
		
		/*
		var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if(re.exec(_ua) != null) rv = parseFloat(RegExp.$1);
		if( rv == 7 ) return rv = "IE" + 7; 
		*/
		
		//other
		var agt = _ua.toLowerCase();
        if (agt.indexOf("chrome") != -1) return 'Chrome';
        if (agt.indexOf("opera") != -1) return 'Opera'; 
        if (agt.indexOf("staroffice") != -1) return 'Star Office'; 
        if (agt.indexOf("webtv") != -1) return 'WebTV'; 
        if (agt.indexOf("beonex") != -1) return 'Beonex'; 
        if (agt.indexOf("chimera") != -1) return 'Chimera'; 
        if (agt.indexOf("netpositive") != -1) return 'NetPositive'; 
        if (agt.indexOf("phoenix") != -1) return 'Phoenix'; 
        if (agt.indexOf("firefox") != -1) return 'Firefox'; 
        if (agt.indexOf("safari") != -1) return 'Safari'; 
        if (agt.indexOf("skipstone") != -1) return 'SkipStone'; 
        if (agt.indexOf("netscape") != -1) return 'Netscape'; 
        if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
	}
		
	document.write( getBrowserType() );
</script>
</head>
<body>
</body>
</html>

 

 

   Edge를 구별하기 위해서 스크립트를 수정 2018.09.06


MS Edge를 구별하기 위해서 스크립트를 수정하였다.


  1. /***********************************************************
  2. *
  3. * Author : serpiko@hanmail.net 허정진 / 2017.06.09
  4. *
  5. * Last Update : 2018.03.05
  6. *
  7. * ClassName : Browser
  8. *
  9. * Public Method : getType, isIE, isMobile
  10. *
  11.  
  12. 권장하는 사용법
  13.  
  14. var browser = new Browser;
  15. console.log( browser.getType() );
  16. console.log( browser.isIE() );
  17. console.log( browser.isMobile() );
  18.  
  19. *
  20. *
  21. *
  22. ***********************************************************/
  23. var Browser = function(){}
  24.  
  25. Browser.prototype = (function(){
  26. return{
  27. constructor : Browser
  28. }
  29. })();
  30.  
  31. Browser.prototype.getType = function(){
  32.  
  33. var agent = navigator.userAgent.toLowerCase(),
  34. name = navigator.appName,
  35. browser;
  36.  
  37.  
  38.  
  39. // MS 계열 브라우저를 구분하기 위함.
  40. if(name === 'Microsoft Internet Explorer' || agent.indexOf('trident') > -1 || agent.indexOf('edge/') > -1) {
  41.  
  42. /*
  43. var trident = _ua.match(/Trident\/(\d.\d)/i);
  44. if( trident != null )
  45. {
  46. if( trident[1] == "7.0" ) return rv = "IE" + 11;
  47. if( trident[1] == "6.0" ) return rv = "IE" + 10;
  48. if( trident[1] == "5.0" ) return rv = "IE" + 9;
  49. if( trident[1] == "4.0" ) return rv = "IE" + 8;
  50. }
  51. */
  52.  
  53. browser = 'ie';
  54. if(name === 'Microsoft Internet Explorer') { // IE old version (IE 10 or Lower)
  55. agent = /msie ([0-9]{1,}[\.0-9]{0,})/.exec(agent);
  56. browser += parseInt(agent[1]);
  57. } else { // IE 11+
  58. if(agent.indexOf('trident') > -1) { // IE 11
  59. browser += 11;
  60. } else if(agent.indexOf('edge/') > -1) { // Edge
  61. browser += 'edge';
  62. }
  63. }
  64.  
  65. return browser;
  66.  
  67. }else{
  68.  
  69. //other
  70. if (agent.indexOf("chrome") != -1) return 'Chrome';
  71. if (agent.indexOf("opera") != -1) return 'Opera';
  72. if (agent.indexOf("staroffice") != -1) return 'Star Office';
  73. if (agent.indexOf("webtv") != -1) return 'WebTV';
  74. if (agent.indexOf("beonex") != -1) return 'Beonex';
  75. if (agent.indexOf("chimera") != -1) return 'Chimera';
  76. if (agent.indexOf("netpositive") != -1) return 'NetPositive';
  77. if (agent.indexOf("phoenix") != -1) return 'Phoenix';
  78. if (agent.indexOf("firefox") != -1) return 'Firefox';
  79. if (agent.indexOf("safari") != -1) return 'Safari';
  80. if (agent.indexOf("skipstone") != -1) return 'SkipStone';
  81. if (agent.indexOf("netscape") != -1) return 'Netscape';
  82. if (agent.indexOf("mozilla/5.0") != -1) return 'Mozilla';
  83. }
  84. }
  85.  
  86. Browser.prototype.isIE = function(){
  87. var bool = false;
  88. var patt = /ie/gi;
  89. if( patt.test( this.getType() ) ) bool = true;
  90. return bool;
  91. }
  92.  
  93. Browser.prototype.isMobile = function(){
  94. var filter = "win16|win32|win64|mac";
  95. if( navigator.platform ){
  96. if( filter.indexOf(navigator.platform.toLowerCase())<0 ){
  97. //alert('mobile');
  98. return true; //Mobile
  99. }else{
  100. //alert('pc');
  101. return false; //PC
  102. }
  103. }
  104. }






   IE 호환성 여부는 어떻게 판별 하는가

 

호환성보기 옵션이 있는IE의 경우 같은 trident라 해도 MSIE가 다르게 표기된다.

 

예를 들어 IE10의 경우

 

//IE10 Default

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

 

//IE10 호환성보기 체크

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727;

.NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)

 

이렇게 MSIE 버전에 따라서 내부적으로 7버전의 엔진을 가지고 동작하게 되고 직접 MSIE 버전을 알아 보려면 다음과 같은 정규식으로

 

확인이 가능하다.

 

var rv;

var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
if(re.exec( navigator.userAgent ) != null) rv = parseFloat(RegExp.$1);

 

console.log( rv ); // 7

 

 

   IE 호환성 렌더링의 해결책

 

MSIE로 IE의 엔진 버전을 알 수있겠지만 그냥 강제로 본인의 최신 버전 IE로 인식 되게 할 수 있다.

 

바로 meta태그를 이용하는 것인데 다음과 같다.

 

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

 

참고로 특정 엔진버전으로 렌더링 하려면 다음과 같이 지정 해 주면 된다.

 

<meta http-equiv="X-UA-Compatible" content="IE=5">

<meta http-equiv="X-UA-Compatible" content="IE=6">

<meta http-equiv="X-UA-Compatible" content="IE=7">

<meta http-equiv="X-UA-Compatible" content="IE=8">

<meta http-equiv="X-UA-Compatible" content="IE=9">

<meta http-equiv="X-UA-Compatible" content="IE=10">

 

 

 

 

* 내용수정 : 2014.07.22  / 추가내용 제보 : veo

 

 

 

댓글