我从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将这些条件编译行视为简单注释,因此正在删除所有这些注释。
出于好奇,我也在同一个文件上测试了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 :(得分: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文件。