我看过这样一个片段,用于在JavaScript中使用条件注释检测IE。
var ie = (function(){
var undef, v = 3, div = document.createElement('div');
// the while loop is used without an associated block: {}
// so, only the condition within the () is executed.
// semicolons arent allowed within the condition,
// so a comma is used to stand in for one
// basically allowing the two separate statements
// to be evaluated sequentially.
while (
div.innerHTML = '<!--[if gt IE '+(++v)+']><i></i><![endif]-->',
div.getElementsByTagName('i')[0]
);
// each time it's evaluated, v gets incremented and
// tossed into the DOM as a conditional comment
// the i element is then a child of the div.
// the return value of the getEBTN call is used as
// the final condition expression
// if there is an i element (the IE conditional
// succeeded), then getEBTN's return is truthy
// and the loop continues until there is no
// more i elements.
// In other words: ** MAGIC**
return v > 4 ? v : undef;
}());
上面给出的是documented (and slightly improved) version by Paul Irish上的snippet by James Padolsey。我发布评论版本是为了让您知道如果有人可能需要更简单的解释。
我真的很想知道在while循环中发生了什么。我不明白。
答案 0 :(得分:2)
(假设我没有笨拙地搞砸了)while
循环等同于以下内容:
var elt;
do
{
v++;
div.innerHTML = '<!--[if gt IE ' + v + ']><i></i><![endif]-->'
elt = div.getElementsByTagName('i')[0];
} (while elt);
mdc或任何好的东西覆盖了这个(stmt1,stmt2)的东西。
以下是MDC对while
所说的内容:
while (condition) statement
<强>
condition
强>
在每次循环之前计算的表达式。如果此条件的计算结果为true
,则执行statement
。当条件求值为false
时,继续执行while
循环后的语句。
我们可以准确地从MDC中找到JavaScript中的 expression :
表达式是评估为单个值的任何有效的文字,变量,运算符和表达式集合;值可以是数字,字符串或逻辑值。
从概念上讲,有两种类型的表达式:将值赋给变量的表达式和仅具有值的表达式。例如,表达式
x = 7
是一个表达式,它将x赋值为7。该表达式本身的计算结果为7。此类表达式使用赋值运算符。另一方面,表达式3 + 4
简单地评估为7;它不执行任务。此类表达式中使用的运算符简称为运算符。
如果您有勇气,还可以查看ECMA-262 language specification,特别是以下部分:
,
)while
声明对不起,我无法提供直接链接,因为它全部都在PDF中。
答案 1 :(得分:1)
v
存储IE版本号。它被初始化为3,因此循环在每次迭代时都会创建如下的字符串:
// v = 3
<!--[if gt IE 4]><i></i><![endif]-->
// v = 4
<!--[if gt IE 5]><i></i><![endif]-->
如果您对此部分感到困惑:
+(++v)+
它只是意味着在上下文中将'<!--[if gt IE '
与递增的v
值连接起来,然后将新形成的字符串与']><i></i><![endif]-->'
连接起来。增量运算符++
用于< em> return v
的递增值,因为在 v
之前。如果它出现在v
之后,则会在增量发生之前返回v
的当前值。 Mozilla做的解释比我a better job:
此运算符递增(加1) 它的操作数并返回一个值。如果 使用postfix,后跟运算符 操作数(例如,x ++),然后它 在递增之前返回值。 如果之前使用了运算符前缀 操作数(例如,++ x),然后它 递增后返回值。
因此创建的第一个条件注释始终为4.循环继续,直到div.getElementsByTagName('i')[0]
不生成任何DOM元素,计算结果为false
并强制循环退出。
答案 2 :(得分:0)
此
<div><!--[if gt IE 6]><i></i><![endif]--></div>
有效地生成类似于
的DOM<div><i></i></div>
在IE的版本中&gt; 6.但是在早期版本和根本不是IE的浏览器中,它会生成
<div></div>
所以你输入“if gt IE version ”HTML并根据i
元素是否是DOM的一部分,你可以弄清楚你是否在某个版本上IE的大于v
。当您获得v
元素存在i
元素的值时,您就完成了!