2013-01-17 8 views
0

야후 자바 스크립트 Uglify (yuglify)를 https://github.com/yui/yuglify에서 다운로드했으며 아파치 서버에서 호스팅되는 일부 PHP 프로젝트에서 JS 및 CSS 압축 용으로 사용하려고합니다. 이러한 원래 내용을 가진 파일 작게를 시도 :yuglify JavaScript 컴파일러 제거 조건부 컴파일

var _cmFrameList = new Array(); // a pool of reusable iframes 
var _cmFrameListSize = 0;   // keep track of the actual size 
var _cmFrameIDCount = 0;   // keep track of the frame id 
var _cmFrameMasking = true;   // use the frame masking 

// disable iframe masking for IE7 
/*@cc_on 
    @if (@_jscript_version >= 5.6) 
     if (_cmFrameMasking) 
     { 
      var v = navigator.appVersion; 
      var i = v.indexOf ("MSIE "); 
      if (i >= 0) 
      { 
       if (parseInt (navigator.appVersion.substring (i + 5)) >= 7) 
        _cmFrameMasking = false; 
      } 
     } 
    @end 
@*/ 

var _cmClicked = false;    // for onClick 

을하지만 대신 가지고 : 원본 파일의 내용에서

var _cmFrameList=new Array,_cmFrameListSize=0,_cmFrameIDCount=0,_cmFrameMasking=!0,_cmClicked=!1 

, 오래된 IE 브라우저에서 작동하도록 필요한 몇 가지 조건부 컴파일 코드가있다 (@cc_on, @if, @end 등으로 시작하는 주석 처리 된 행). yuglify는 이러한 조건부 컴파일 라인을 간단한 주석으로 취급하고 있으며, 따라서 모든 것을 제거하고 있습니다.

호기심 때문에이 동일한 파일에서도 yuicompressor를 테스트했으며 (https://github.com/yui/yuicompressor/downloads) 모든 조건부 컴파일 코드가 손상되지 않은 것으로 보입니다. 줄 바꿈조차도 여전히 존재합니다 :

var _cmFrameList=new Array();var _cmFrameListSize=0;var _cmFrameIDCount=0;var _cmFrameMasking=true; 
/*@cc_on 
    @if (@_jscript_version >= 5.6) 
     if (_cmFrameMasking) 
     { 
      var v = navigator.appVersion; 
      var i = v.indexOf ("MSIE "); 
      if (i >= 0) 
      { 
       if (parseInt (navigator.appVersion.substring (i + 5)) >= 7) 
        _cmFrameMasking = false; 
      } 
     } 
    @end 
@*/ 
var _cmClicked=false; 

오래된 IE 브라우저는 조건부 컴파일 라인이 깨져서 왜곡됩니다. 그것을 제거하지 않고 yuglify를 사용할 수 있습니까?

답변

0

eval 명령을 사용하여 해결 방법을 찾았습니다.

var is_IE_browser = eval('/*@cc_on [email protected]*/false'); 
var jscript_version = (is_IE_browser) ? eval("/*@cc_on @_jscript_version @*/") : (0); 
var IE_version = (is_IE_browser) ? (get_IE_version()) : (0); 

그리고, 나는이 기능을 만들어 :

Firtly, 나는이 전역 변수 생성 이렇게

function get_IE_version(){ 
    var IE_version; 
    if(jscript_version == 5.6 || (jscript_version == 5.7 && navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) { 
     IE_version = 6; 
    } else if(jscript_version == 5.7){ 
     IE_version = 7; 
    } else if(jscript_version == 5.8){ 
     IE_version = 8; 
    } else if(jscript_version == 9){ 
     IE_version = 9; 
    } else if(jscript_version == 10){ 
     IE_version = 10; 
    } else { 
     IE_version = 0; 
    } 
    return IE_version; 
} 

을, 지금은 모든 조건부 컴파일 코드 (cc_on)와 교체 할 수 있습니다 위의 변수를 사용하는 몇 가지 조건.

"is_IE_browser"변수는 브라우저가 IE이면 true를 반환하고 그렇지 않으면 false를 반환합니다.

변수 "IE_version"은 브라우저가 IE 인 경우 IE 버전 번호를 반환하고 그렇지 않으면 0을 반환합니다.

이 코드를 사용하면 대부분의 IE 브라우저 (브라우저 사용자 에이전트 데이터에서 약간의 검색이 필요하고 브라우저 스니핑에 취약하지만 IE6에서 살 수있는 IE6 제외)를 안정적으로 검색 할 수 있습니다.

이 방법을 사용하면 이전 브라우저를 정상적으로 감지하고 내 JS 파일을 손상시키지 않고 yuglify를 계속 사용할 수 있습니다.