为何IE9下CSS类未被if(/*@cc_on!@*/false)代码覆盖?
为什么
if(/*@cc_on!@*/false)在IE10会覆盖CSS类,IE9却不会? 这个问题的核心在于IE9和IE10对JavaScript条件编译语法与脚本执行逻辑的处理差异,咱们拆解细节来看:
先搞懂/*@cc_on!@*/false是什么
这是IE专属的条件编译trick,利用IE对特殊注释的解析规则生成版本依赖的布尔值:
- 条件编译是IE早期用来针对不同版本写专属代码的机制,
@cc_on是开启条件编译的标记。 - 这个表达式通过注释嵌套,让不同IE版本解析出完全不同的布尔结果。
IE9的执行流程(不覆盖类名)
- HTML条件注释生效:IE9完全支持传统的
<!--[if IE 9]>条件注释,页面加载时会直接给<html>标签加上ie9 lt-ie10 lt-ie11 lt-ie12 gt-ie8 gt-ie7 gt-ie6这些类。 - UA判断不触发:IE9的UserAgent包含
Trident/5.0,不会匹配脚本里的Trident/7.0(IE11)或Trident/6.0(IE10)分支,所以这部分代码不会修改类名。 - 条件编译表达式求值为
false:在IE9中,/*@cc_on!@*/false会被解析为false,因此if(false)块里的代码不会执行,自然不会覆盖之前的类名。
IE10的执行流程(覆盖类名)
- HTML条件注释失效:IE10开始废弃了对HTML条件注释的支持,开头的
<!--[if IE 9]>会被当作普通注释忽略,<html>初始没有任何IE专属类。 - UA判断触发类名设置:IE10的UserAgent包含
Trident/6.0,会匹配脚本里的第二个分支,给<html>加上ie10 lt-ie11 lt-ie12 gt-ie9 gt-ie8 gt-ie7 gt-ie6类。 - 条件编译表达式求值为
true:IE10虽然废弃了HTML条件注释,但保留了对JavaScript中条件编译的支持,不过解析逻辑有变化——/*@cc_on!@*/false在这里会被解析为true,所以if(true)块里的代码会执行,把<html>的类名替换成gt-ie11 gt-ie10 gt-ie9 gt-ie8 gt-ie7 gt-ie6,直接覆盖了之前通过UA判断设置的类名。
总结差异根源
微软在IE10中对条件编译机制做了针对性调整:
- 移除HTML条件注释支持,迫使开发者转向UA检测或特性检测方案。
- 修改了JavaScript中条件编译的解析规则,导致
/*@cc_on!@*/false这个trick的求值结果在IE9(false)和IE10(true)中完全相反,这就是你看到的类名覆盖差异的核心原因。
内容的提问来源于stack exchange,提问作者Jayesh Dhandha
相关产品推荐
相关产品推荐

