分享
 
 
 

jscript/&#106avascript条件编译

王朝html/css/js·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

IE中jscript/javascript的条件编译

作者:JavaScript Kit译者:子乌(Sheneyan)翻译日期:2006-02-12

英文原文:Conditional Compilation of JScript/ JavaScript in IE版权:翻译未经过javascript kit同意,我只对我所翻译的中文部分负责。版权归原作者所有。

子乌注:如同以前的文章一样,我只能按照我对文章的理解翻译出来,但是我自己水平实在有限,很多地方可能存在对原文的误解甚至是误会,有可能的话还是读一读原文。

条件编译概述

在IE中,有一个鲜为人知的功能叫做条件编译(conditional compilation)。自从IE4开始支持这个功能,它由于在一些Ajax相关的javascript脚本中出现而受到一些关注。条件编译作为一种独立形式的对象判断,使得IE可以根据预定义或用户定义的条件来决定你的jscript或javascript代码特定部分是否编译。也可以把它看成是你的代码的条件注释(contional comments,很快会翻译这篇文章),使你的代码能够在非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>

例子:

运行代码框

<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>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

如果你使用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外的浏览器)

/*@cc_on @if (@_win32) document.write("操作系统是32位windows。浏览器是IE。"); @else document.write("操作系统不是32位windows。浏览器是IE。"); @end@*/

这是一段完整的脚本,只被ie浏览器所识别并忽略其他所有浏览器,这段脚本在不同的操作系统上将显示不同的内容。对比一下下面这个例子……

if else 逻辑2 (包含其他浏览器)

/*@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外的浏览器)

继续吧,可以看全部内容了:

/*@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(包含其他浏览器)

/*@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或计算机大致描述的预定义条件编译变量:

在大多数情况下,你也许只需要使用@_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@*/

用户自定义变量

你也可以在条件编译块中定义你自己的变量,语法如下:

@set @varname = term

在条件编译中,数字(Numeric)与布尔(Boolean)类型的变量可以使用,但字符型(String)无法使用。比如:

@set @myvar1 = 35

@set @myvar3 = @_jscript_version

在条件编译逻辑中能够使用标准的运算符:

! ~

* / %

+ -

<< >> >>>

< <= > >=

== != === !==

& ^ |

&& |

你能够通过判断是否返回NaN来确定是否定义了一个用户自定义变量:

@if (@newVar != @newVar)

//该变量未定义

由于NaN是唯一一个不等于其自身的值,所以这段脚本能够正常运行。

条件编译示例--try catch语句

在教程的开始,我曾经提及条件编译如何由于在一些Ajax的JavaScript中的出现而显示出它值得自夸的一面。现在我要告诉你我所指的内容。一个Ajax脚本通常包含一个中心函数用于判断浏览器(ie、ff等)对产生异步请求对象的支持:

典型的ajax函数:

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处理函数:

真正的跨浏览器函数:

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

 

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有