2

我在几个在线示例中看到了这种检测 IE 的方法:

if (/*@cc_on!@*/false) { // check for Internet Explorer

这是否类似于 IE 在 HTML 中识别的条件注释?

4

3 回答 3

3

该语句控制IE 中评论内容的条件编译。如果 IE 看​​到这条评论,它实际上会将评论块的内容编译为纯代码。现在诀窍发生!在评论中。

IE 编译!就像它被写入源代码一样,因此它将代码处理为if (!false),而所有其他浏览器将其视为if (false).

于 2012-04-09T12:01:41.500 回答
1

我们在这里有一个很好的描述

条件编译。

这种方法是目前首选的方法。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.  ^_^
}
于 2013-05-09T07:26:09.057 回答
1

微软对此提供了一些有用的见解。

似乎这个声明告诉脚本浏览器是否支持条件编译,如果支持,则执行后面的任何代码

/*@  ...

... @*/
于 2012-04-09T12:01:27.590 回答