首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yuglify JavaScript压缩器删除条件编译

yuglify JavaScript压缩器删除条件编译
EN

Stack Overflow用户
提问于 2013-01-17 22:14:22
回答 1查看 318关注 0票数 0

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

代码语言: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

但得到的却是这个:

代码语言:javascript
复制
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,似乎所有的条件编译代码都是完好无损的。即使换行符仍然存在:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-12 04:47:25

我找到了解决这个问题的方法,通过使用eval命令来解决这个问题。

首先,我创建了以下全局变量:

代码语言:javascript
复制
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);

然后,我创建了这个函数:

代码语言:javascript
复制
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文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14380971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档