3

我正在寻找在 javascript 中检测 ie 浏览器的方法,这是我找到的解决方案之一:

if (-[1,]) {
    //Not IE

} else {
    //IE
}

这行得通,我可以使用它来应用 CSS 就好了。我的问题是,这里的幕后发生了什么?我不明白这个条件,把它输入谷歌让我很感兴趣,但不相关的结果......

编辑

我的代码工作正常。我已经在所有浏览器和所有版本的 IE 中对其进行了测试。在这一点上,这只是一个好奇,为什么这是有效的。看起来它与数组和负索引或类似的东西有关。这是我的问题,为什么,而不是我如何让它工作,因为它已经工作了。

4

2 回答 2

6

IE 存在 Javascript 解析问题:[1,]被解析为[1, undefined].
符合标准的浏览器会忽略逗号并将其解析为[1]

一元否定运算符在应用于长度为 1 的数组时,将否定数组的单个元素。
因此,-[1]-1(这是真的)。
但是,-[1, anything](这是 IE 解析的方式[1,])是NaN,这是错误的。

但是,您不应依赖此行为

相反,使用Modernizr,它将自动为每个功能添加类,而不管浏览器如何。
如果您真的想专门区分 IE(这是一个坏主意),请使用条件注释

于 2013-05-22T17:21:54.193 回答
4

打开控制台,看看发生了什么。

铬合金:

> -[1,]
  -1
> [1,].length
  1

即 8

> -[1,]
  NaN 
> [1,].length
  2

即 9

> -[1,]
  -1
> [1,].length
  1

IE8 将进入 else 语句,因为NaN它是一个错误的值。-1是一个真实值,因此它将被视为真实。它基本上是在测试浏览器如何处理数组中的尾随逗号。IE8 及以下版本添加了一个额外的索引,而其他的则忽略了逗号。IE9+ 修复了这个问题,也忽略了它。当一元减号[可以使用一元加号]将数组转换为数字并且您获得NaN-1取决于具有额外未定义索引的数组时,魔术就起作用了。

如果您的代码在 IE9 或 IE10 上进入 else,那意味着您的页面不是在 IE9/10 模式下运行,而是在 IE8 或 IE7 模式下运行。

于 2013-05-22T17:21:55.950 回答