在IE中,有一个鲜为人知的功能叫做条件编译。自从IE4开始支持这个功能,它由于在一些Ajax相关的javascript脚本中出现而受到一些关注。条件编译作为一种独立形式的对象判断,使得IE可以根据预定义或用户定义的条件来决定你的jscript或javascript代码特定部分是否编译。也可以把它看成是你的代码的条件注释,使你的代码能够在非IE浏览上也顺利运行。
通过在你的脚本中使用<span title="代码">@cc_on</span>
来激活条件编译,或者直接使用<span title="代码">@if</span>
或者<span title="代码">@set</span>
等等作为CC逻辑中一部分的句子来激活它。这里是一个示范例子:
如果你使用IE(任何版本),你应该能够看到第一个<span title="代码">document.write()</span>
的输出,如果是IE5+,接下来的两个<span title="代码">document.write()</span>
你也能够看见(因为从IE5开始支持JScript 5)。最后一个<span title="代码">document.write()</span>
方法是为了其他非IE5+浏览器服务的,无论是Firefox,opera,IE4,或者什么别的。条件编译依赖于类似在条件注释中使用的注释标签,以确保它在所有浏览器中都能工作顺畅。
当使用条件编译的时候,最好先通过<span title="代码">@cc_on</span>
语句来激活它,只有这样你才能在你的脚本中包含注释标签以保证浏览器兼容,、就好像上面例子中所显示的那样。(子乌注:这句英文我翻译的不是很顺...看起来似乎与上面的句子矛盾)
在这个奇怪的开场白之后,这里是一些用于条件便于的条件语句:
现在让我们看一些“古怪”的例子。
这是一段完整的脚本,只被ie浏览器所识别并忽略其他所有浏览器,这段脚本在不同的操作系统上将显示不同的内容。对比一下下面这个例子……
熟练使用注释标签,这个例子中的<span title="代码">else</span>
部分能够包含所有的非ie浏览器(如firefox),以及非32位windows下的IE。努力的研究这段注释,直到你脑袋发昏,你就会明白这个逻辑了:)
继续吧,可以看全部内容了:
全面的处理。在这最后一个例子中,最后一个<span title="代码">else</span>
语句包含了所有非IE浏览器。
在之前一部分中你看到了一些奇怪变量比如<span title="代码">@_win32</span>
。这是一些你能够用来判断IE或计算机大致描述的预定义条件编译变量:
变量 | 描述 |
---|---|
@_win32 | 当运行在一个win32系统中时返回true, 否则返回 NaN. |
@_win16 | 当运行在一个win16系统中时返回true , 否则返回 NaN. |
@_mac | 当运行在一个Apple的Macintosh系统中时返回 true , 否则返回 NaN. |
@_alpha | 当运行于DEC aplha处理器上时返回true ,否则返回 NaN. |
@_x86 | 当运行于一个Intel处理上时返回true ,否则返回 NaN. |
@_mc680x0 | 运行于Motorola 680x0处理器上时 true , 否则返回 NaN. |
@_PowerPC | 运行于Motorola PowerPC处理器上时 true , 否则返回 NaN. |
@_jscript | 永远返回 true. |
@_jscript_build | JScript脚本引擎编译次数. |
@_jscript_version | Jscript版本,以主要版本.次要版本格式展现.
IE4 支持JScript 3.x |
@_debug | 如果编译于debug模式则返回 true ,否则返回false. |
@_fast | 如果编译于fast模式则返回 true ,否则返回false. |
在大多数情况下,你也许只需要使用<span title="代码">@_win</span>
和<span title="代码">@jscript_build</span>
:
你也可以在条件编译块中定义你自己的变量,语法如下:
在条件编译中,数字与布尔类型的变量可以使用,但字符型无法使用。比如:
在条件编译逻辑中能够使用标准的运算符:
你能够通过判断是否返回<span title="代码">NaN</span>
来确定是否定义了一个用户自定义变量:
由于<span title="代码">NaN</span>
是唯一一个不等于其自身的值,所以这段脚本能够正常运行。
在教程的开始,我曾经提及条件编译如何由于在一些Ajax的JavaScript中的出现而显示出它值得自夸的一面。现在我要告诉你我所指的内容。一个Ajax脚本通常包含一个中心函数用于判断浏览器(ie、ff等)对产生异步请求对象的支持:
Many people think that the <span title="code">try/catch<code><span title="代码">try/catch</span>
statement can successfully test Ajax support. Unfortunately, this is not true. Browsers that do not support <span title="code">throw/catch<code><span title="代码">throw/catch</span>
, such as IE 4.x, will actually block the above code and return an error. To overcome this problem, conditional compilation can be used to create a truly cross-browser friendly Ajax handler:
Using conditional compilation, the complete <span title="code">try/catch<code><span title="代码">try/catch</span>
block is only used for IE5, other browsers, such as IE4 or non-IE browsers try to decipher It (dicipher it... What is this dicipher? The explanation of "decipher" was found by google. I personally feel that it is better to translate it into "ignore"?). Obviously Firefox will go ahead and use XMLHttpRequest instead. Now you get it - a truly cross-browser ajax function! ( Ziwu’s note: You can see a more comprehensive way of writing this function in another article I translated. )