我在几个在线示例中看到了这种检测 IE 的方法:
if (/*@cc_on!@*/false) { // check for Internet Explorer
这是否类似于 IE 在 HTML 中识别的条件注释?
我在几个在线示例中看到了这种检测 IE 的方法:
if (/*@cc_on!@*/false) { // check for Internet Explorer
这是否类似于 IE 在 HTML 中识别的条件注释?
该语句控制IE 中评论内容的条件编译。如果 IE 看到这条评论,它实际上会将评论块的内容编译为纯代码。现在诀窍发生!
在评论中。
IE 编译!
就像它被写入源代码一样,因此它将代码处理为if (!false)
,而所有其他浏览器将其视为if (false)
.
我们在这里有一个很好的描述
条件编译。
这种方法是目前首选的方法。Dean Edwards 在他的博客文章Sniff中描述了这种方法的瑰宝。据我所知,这是检测 IE 最干净、最可靠的方法。
var isMSIE = /*@cc_on!@*/false;
很简单,不是吗?没有用户代理,没有 20 行条件语句和字符串搜索。
这段代码是如何工作的?Internet Explorer 使用 JScript,一种由 Microsoft 开发的专有形式的 JavaScript (ECMAScript)。JScript 有一个称为条件编译的功能,它允许我们在特殊格式的注释中添加特定于 JScript 的 JavaScript。其他 JavaScript 编译器会忽略此代码,认为它是注释,而 JScript 会识别并处理它。
/*@cc_on 开始注释,@*/ 结束注释。
当任何非 IE 浏览器看到 var isMSIE = /*@cc_on!@*/false; 时,它实际上将其视为 var isMSIE = false;。Internet Explorer 的 JScript 会在注释中添加感叹号,表示 IE 会看到 var isMSIE = !false;。请记住,感叹号反转布尔值,所以 !false 等价于 true。
正如 Dean 指出的那样,有一种更简单的方法来编写它(尽管它的可读性略差):
var isMSIE/*@cc_on=1@*/;
如果一个变量在声明时没有赋值,默认情况下它会返回'falsy'(null)。因此,非 IE 浏览器会将此行视为 var isMSIE;而 Internet Explorer 的 JScript 会将其视为 var isMSIE=1; (分配 1 使变量“真实”)。
我更喜欢通过从 isMSIE 中删除 MS 来缩短它,使其简单地为 isIE。注意:最好的做法是给布尔值一个暗示布尔值代表什么的名称,通常采用准问题格式。使用普通的旧 var IE 不会告诉我们变量是布尔值,也不会告诉我们布尔值正在回答什么问题。var isIE 可以。
var isIE/*@cc_on=1@*/;
if(isIE){
//Do something. I suggest downloading Firefox. ^_^
}