0

我已经从https://github.com/yui/yuglify下载了 Yahoo JavaScript Uglify (yuglify) ,我打算将它用于托管在 apache 服务器上的一些 PHP 项目的 JS 和 CSS 压缩。尝试使用以下原始内容缩小文件:

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 将这些条件编译行视为简单注释,因此将其全部删除。

出于好奇,我也在同一个文件(https://github.com/yui/yuicompressor/downloads)上测试了 yuicompressor,似乎所有条件编译代码都完好无损。甚至换行符仍然存在:

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?

4

1 回答 1

0

通过使用 eval 命令的一些解决方法,找到了解决它的方法。

首先,我创建了这些全局变量:

var is_IE_browser = eval('/*@cc_on !@*/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 文件。

于 2013-11-11T20:47:24.590 回答