2013-01-17 30 views
0

我已經從https://github.com/yui/yuglify下載了雅虎JavaScript Uglify(yuglify),我打算將它用於在apache服務器上託管的一些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命令的一個小解決方法。

Firtly,我創建這些全局變量:

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); 

然後,我創造了這個功能:

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)與使用上述變量的一些條件。

如果瀏覽器是IE,變量「is_IE_browser」將返回true,否則返回false。

如果瀏覽器是IE,變量「IE_version」將返回IE版本號,如果不是,則返回零。使用此代碼,我可以可靠地檢測大多數IE瀏覽器(IE6除外,需要對瀏覽器用戶代理數據進行一些搜索,並且容易受到瀏覽器嗅探的影響,但我可以忍受它)。

這樣,我可以很好地檢測舊版瀏覽器,並繼續使用yuglify而不會損壞我的JS文件。