IE中jscript/javascript的条件编译
- 作者:JavaScript Kit
- 译者:子乌(Sheneyan)
- 翻译日期:2006-02-12
- 英文原文:Conditional Compilation of JScript/ JavaScript in IE
- 版权:翻译未经过javascript kit同意,我只对我所翻译的中文部分负责。版权归原作者所有。
条件编译概述
在IE中,有一个鲜为人知的功能叫做条件编译。自从IE4开始支持这个功能,它由于在一些Ajax相关的javascript脚本中出现而受到一些关注。条件编译作为一种独立形式的对象判断,使得IE可以根据预定义或用户定义的条件来决定你的jscript或javascript代码特定部分是否编译。也可以把它看成是你的代码的条件注释,使你的代码能够在非IE浏览上也顺利运行。
语法概述
通过在你的脚本中使用@cc_on
来激活条件编译,或者直接使用@if
或者@set
等等作为CC逻辑中一部分的句子来激活它。这里是一个示范例子:
- <script type="text/javascript">
- /*@cc_on
- document.write("JScript 版本: " + @_jscript_version + ".<br>");
- /*@if (@_jscript_version >= 5)
- document.write("JScript 版本 5.0+.<br \/>");
- document.write("只有当浏览器支持JScript5+的时候你才能看到这些文字.<br>");
- @else @*/
- document.write("当你使用其他浏览器(比如: Firefox, IE 4.x 之类)的时候看到这行文字<br>");
- /*@end
- @*/
- </script>
例子:
JScript 版本: 5.6.JScript 版本 5.0+.
只有当浏览器支持JScript5+的时候你才能看到这些文字。
如果你使用IE(任何版本),你应该能够看到第一个document.write()
的输出,如果是IE5+,接下来的两个document.write()
你也能够看见(因为从IE5开始支持JScript 5)。最后一个document.write()
方法是为了其他非IE5+浏览器服务的,无论是Firefox,opera,IE4,或者什么别的。条件编译依赖于类似在条件注释中使用的注释标签,以确保它在所有浏览器中都能工作顺畅。
当使用条件编译的时候,最好先通过@cc_on
语句来激活它,只有这样你才能在你的脚本中包含注释标签以保证浏览器兼容,、就好像上面例子中所显示的那样。(子乌注:这句英文我翻译的不是很顺...看起来似乎与上面的句子矛盾)
@if, @elif, @else,@end 语句
在这个奇怪的开场白之后,这里是一些用于条件便于的条件语句:
- @if
- @elif
- @else
- @end
现在让我们看一些“古怪”的例子。
if else 逻辑 (排除IE外的浏览器)
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12- /*@cc_on
- @if (@_win32)
- document.write("操作系统是32位windows。浏览器是IE。");
- @else
- document.write("操作系统不是32位windows。浏览器是IE。");
- @end
- @*/
这是一段完整的脚本,只被ie浏览器所识别并忽略其他所有浏览器,这段脚本在不同的操作系统上将显示不同的内容。对比一下下面这个例子……
if else 逻辑2 (包含其他浏览器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12- /*@cc_on
- /*@if (@_win32)
- document.write("操作系统是32位windows。浏览器是IE。");
- @else @*/
- document.write("浏览器不是IE (如: Firefox)或者浏览器不是在32位windows下的IE。");
- /*@end
- @*/
熟练使用注释标签,这个例子中的else
部分能够包含所有的非ie浏览器(如firefox),以及非32位windows下的IE。努力的研究这段注释,直到你脑袋发昏,你就会明白这个逻辑了:)
if, elseif, else逻辑 (排除IE外的浏览器)
继续吧,可以看全部内容了:
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12- /*@cc_on
- @if (@_jscript_version >= 5)
- document.write("IE Browser that supports JScript 5+");
- @elif (@_jscript_version >= 4)
- document.write("IE Browser that supports JScript 4+");
- @else
- document.write("Very old IE Browser");
- @end
- @*/
if, elseif, else 逻辑2(包含其他浏览器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12- /*@cc_on
- /*@if (@_jscript_version >= 5)
- document.write("IE Browser that supports JScript 5+");
- @elif (@_jscript_version >= 4)
- document.write("IE Browser that supports JScript 4+");
- @else @*/
- document.write("Non IE Browser (one that doesn't support JScript)");
- /*@end
- @*/
全面的处理。在这最后一个例子中,最后一个else
语句包含了所有非IE浏览器。
条件编译变量
在之前一部分中你看到了一些奇怪变量比如@_win32
。这是一些你能够用来判断IE或计算机大致描述的预定义条件编译变量:
IE4 支持JScript 3.x
IE5.x 支持 JScript 5.5-
IE6 支持 JScript 5.6
在大多数情况下,你也许只需要使用@_win
和@jscript_build
:
- /*@cc_on
- @if (@_win32)
- document.write("OS is 32-bit. Browser is IE.");
- @else
- document.write("OS is NOT 32-bit. Browser is IE.");
- @end
- @*/
用户自定义变量
你也可以在条件编译块中定义你自己的变量,语法如下:
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12- @set @varname = term
在条件编译中,数字与布尔类型的变量可以使用,但字符型无法使用。比如:
Language:javascript, parsed in: 0.002 seconds, using GeSHi 1.0.7.12- @set @myvar1 = 35
- @set @myvar3 = @_jscript_version
在条件编译逻辑中能够使用标准的运算符:
- ! ~
- * / %
- + -
- << >
- < <= > >=
- == != === !==
- & ^ |
- && |
你能够通过判断是否返回NaN
来确定是否定义了一个用户自定义变量:
- @if (@newVar != @newVar)
- //该变量未定义
由于NaN
是唯一一个不等于其自身的值,所以这段脚本能够正常运行。
条件编译示例--try catch语句
在教程的开始,我曾经提及条件编译如何由于在一些Ajax的JavaScript中的出现而显示出它值得自夸的一面。现在我要告诉你我所指的内容。一个Ajax脚本通常包含一个中心函数用于判断浏览器(ie、ff等)对产生异步请求对象的支持:
典型的ajax函数:
Language:javascript, parsed in: 0.020 seconds, using GeSHi 1.0.7.12- function HttpRequest(url, parameters){
- var pageRequest = false //variable to hold ajax object
- if (window.XMLHttpRequest) // if Mozilla, Safari etc
- pageRequest = new XMLHttpRequest()
- else if (window.ActiveXObject){ // if IE
- try {
- pageRequest = new ActiveXObject("Msxml2.XMLHTTP")
- }
- catch (e){
- try{
- pageRequest = new ActiveXObject("Microsoft.XMLHTTP")
- }
- catch (e){}
- }
- }
- else
- return false
- }
许多人认为try/catch
语句能够顺利的测试Ajax支持,很不幸,这不是真的。那些不支持throw/catch
的浏览器,比如IE 4.x,实际上会阻塞上面这段代码并返回一个错误。为了克服这个问题,条件编译能够用来粗行减一个真正跨浏览器的友好的Ajax处理函数:
真正的跨浏览器函数:
Language:javascript, parsed in: 0.008 seconds, using GeSHi 1.0.7.12- function HttpRequest(url, parameters){
- var pageRequest = false //variable to hold ajax object
- /*@cc_on
- @if (@_jscript_version >= 5)
- try {
- pageRequest = new ActiveXObject("Msxml2.XMLHTTP")
- }
- catch (e){
- try {
- pageRequest = new ActiveXObject("Microsoft.XMLHTTP")
- }
- catch (e2){
- pageRequest = false
- }
- }
- @end
- @*/
- if (!pageRequest && typeof XMLHttpRequest != 'undefined')
- pageRequest = new XMLHttpRequest()
- }
使用条件编译,完整的try/catch
块只用于IE5+, 其余的浏览器,比如IE4或非IE浏览器则试着破译它(dicipher it...这个dicipher是什么?“破译”这个解释是google到的,个人感觉翻译成“忽略”似乎更好?)。明显的Firefox会继续并使用XMLHttpRequest代替。现在你就得到了它--一个真正跨浏览器的ajax函数!(子乌注:在我翻译的另外一篇文章中,可以看到这个函数更全面的写法。)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 黑鸭子2006-樱桃女声[首版][WAV+CUE]
- 颜人中《这是一张情歌专辑》[FLAC/分轨][258.76MB]
- 华晨宇《华晨宇日出演唱会特辑》[320K/MP3][101.77MB]
- 华晨宇《华晨宇日出演唱会特辑》[Hi-Res][24bit 48kHz][FLAC/分轨][941.13MB]
- 刘俊麟 《美妙!我被五小只包围了》[320K/MP3][86.74MB]
- 刘俊麟 《美妙!我被五小只包围了》[FLAC/分轨][454.29MB]
- 群星《错位 影视原声带》[320K/MP3][63.65MB]
- 中国音乐地图之听见四川彝族民间歌曲乐曲集2020[WAV+分轨]
- 姚璎格《姚璎格的歌(24K纯金CD)》[正版原抓WAV+CUE]
- 高垣彩陽《melodia4》【Hi-Res】24bit-96kHz【flac】
- 王菀之《The Missing Something》[320K/MP3][67.2MB]
- 赵翊帆《LUNARFACE》[320K/MP3][88.81MB]
- 赵翊帆《LUNARFACE》[FLAC/分轨][464.62MB]
- 小野丽莎《OnoLisabest1997-2001》日本醇选辑[正版原抓WAV+CUE]
- 天籁之音NanaMouskouri《AtHerVeryBest》K2HD[正版原抓WAV+CUE]