`

IE中的条件编译

 
阅读更多
引用
条件编译介绍

在IE有一个几乎没人知道的特性--“条件编译(Conditional Compilation)”。从IE4开始,IE开始支持这一特性,当它出现在一些Ajax相关的JavaScript中才开始引起人们的注意。它是一种对象探测的绝对形式,条件编译使IE按照用户预先定义在JScript或者JavaScript中的条件逻辑响应你的指令。你也可以把它想成是你脚本的“条件注释(Conditional Comments)”,它一样可以很好的在非IE浏览器中工作。

语法概述:

在脚本中使用 @cc_on 声明来触发条件编译机制启动,也可以直接使用 @if 或 @set 声明作为启动逻辑的一部分。下面是一段例子代码来解释如何启动条件编译机制。

 
<script type="text/javascript">  
  
/*@cc_on 
document.write("JScript version: " + @_jscript_version + ".<br>"); 
   /*@if (@_jscript_version >= 5) 
      document.write("JScript Version 5.0 or better.<br \/>"); 
      document.write("This text is only seen by browsers that support JScript 5+<br>"); 
   @else @*/  
      document.write("This text is seen by all other browsers (ie: Firefox, IE 4.x etc)<br>");  
   /*@end 
@*/  
  
</script> 


输出结果:
引用
JScript version: 5.7.
JScript Version 5.0 or better.
This text is only seen by browsers that support JScript 5+


如果你使用的是IE浏览器(任何版本),你至少应该看到第一个 document.write() 输出,如果是IE5以上版本,应当可以看到第二个 document.write() 输出。最后一个document.wirte()输出是提供给非IE5以上版本IE浏览器使用的(这话说的比较绕),比如FireFox, Opera, IE4。条件编译标签依赖注释标签协调工作,类似“条件注释”,二者结合以保证脚本能在所有浏览器中工作正常。

当脚本通过条件编译运行,最好是以 @cc_on 声明开始,因为这样你能够在脚本中包括注释标签(comment tags)来确保浏览器兼容性。

@if, @elif,@else, and @end statements

下面是 条件编译 中的语法格式:
@if
@elif
@else
@end
现在让我们看一些“生僻”的例子。
if else (IE 专有)
/*@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 
@*/  


上面这段代码只会被IE浏览器解析,而其他所有浏览器都会忽略这段代码,并且这段代码还依赖于你操作系统的位数(and depending on the bit of your OS, 应该是32位还是其他),根据不同的操作系统,这段代码会给出不同的消息。比对一下下面的例子:

if else II (其他浏览器专有)
/*@cc_on 
   /*@if (@_win32) 
      document.write("OS is 32-bit, browser is IE."); 
   @else @*/  
      document.write("Browser is not IE (ie: is Firefox) or Browser is not 32 bit IE.");  
   /*@end 
@*/  
 

通过注释标签操纵,在如Firefox的非IE浏览器以及非32位的IE浏览器中,该示例 else 块中都将提示消息。

if, elseif, else (IE 专有)

继续,整个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 II (其他浏览器专有)
/*@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或者PC某些方面的特征。


预定义的条件编译变量
变量 描述
@_win32	如果运行在Windows 32位操作系统上返回 true, 否则 NaN.
@_win16	如果运行在Windows 16位操作系统上返回 true ,否则 NaN.
@_mac	如果运行在苹果Mac操作系统上返回 true,否则 NaN.
@_alpha	如果运行在DEC Alpha处理器上返回 true,否则 NaN.
@_x86	如果运行在Intel处理器上返回 true, 否则 NaN.
@_mc680x0	如果运行在Motorola 680x0处理器上返回 true, 否则 NaN.
@_PowerPC	如果运行在Motorola PowerPC处理器上返回 true, 否则 NaN.
@_jscript	总是 返回 true.
@_jscript_build	JScript脚本引擎build代号
@_jscript_version	JScript的版本号 
IE4 支持 JScript 3.x
IE5.x 支持 JScript  5.5 or less
IE6 支持 JScript 5.6
@_debug	如果在Debug下编译返回 true, 否则 false.
@_fast	如果在快速模式下编译返回 true, 否则 false
.

大多数情况下,有可能仅仅只使用到 @_win 和 @jscript_build 变量
Js代码 
/*@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 
@*/  


用户自定义变量

用户也可以在 条件编译 代码块中 定义 自己的变量, 使用下面的语法:
Js代码 
@set @varname = term 

条件编译 同样支持数字类型和布尔类型的变量,但是不支持 字符串 变量。例如:
Js代码 
@set @myvar1 = 35  
@set @myvar3 = @_jscript_version  
 

条件编译 中的标准 逻辑运算符 集合:
! ~
* / %
+ -
<< >> >>>
< <= > >=
== != === !==
& ^ |
&& |

可以测试一下如果用户定义一个变量,并且值为NaN:
Js代码 
@if (@newVar != @newVar)  
//this variable isn't defined.
 

只用NaN是它的唯一值并且不等于变量本身的时候才会起作用。


条件编译举例 - try catch 语句块
在本文的开始,作者提到了条件编译是开始出现在Ajax相关的JavaScript脚本当中。下面将演示作者所提到的场景。一段Ajax脚本通常会包含一段创建一个在IE和Firefox中使用的异步传输request请求的对象,而创建该对象的方法通常是固定的。

典型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  
}
 

很多人都会认为在Ajax代码中使用 "try/catch" 块是很优雅的做法,很不幸,事实上并非如此。浏览器并不支持 "throw/catch", 就像 IE4.x,在IE4.x中运行以上代码将会报错。 要解决这一问题,可以使用 条件编译 创建一个真正跨浏览器的友好的 Ajax 解决方法:

Truly cross browser ajax function:

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浏览器无法识别。Firefox明显会使用XMLHttpRequest来替代。使用以上代码,就可以实现跨浏览器创建ajax对象的方法。



原文地址:http://www.javascriptkit.com/javatutors/conditionalcompile.shtml
分享到:
评论

相关推荐

    IE中jscript/javascript的条件编译

    【条件编译】在Internet Explorer(IE)中的JScript和JavaScript是一种特殊的功能,自IE4开始引入,主要用于处理浏览器版本差异的问题。它允许开发者根据预设或用户定义的条件来决定代码的某些部分是否应该在特定...

    JScript的条件编译

    条件编译允许开发者根据特定条件来编译或忽略代码块,使得代码能够在不同的IE版本中适配运行。 在JScript中,条件编译的语法通常使用`@cc_on`开关来开启,并通过一些条件表达式来决定代码的执行。例如,下面的代码...

    浏览器兼容 谷歌IE8.js,IE9.js下载

    `IE8.js`和`IE9.js`是开源的JavaScript库,由谷歌的 Closure Compiler 编译而成,它们主要目标是弥补IE8和IE9在支持JavaScript新特性和CSS3方面与现代浏览器之间的差距。通过引入这些脚本,开发者可以确保他们的网站...

    select2兼容ie8版本的js css zh-cn.js

    《关于Select2在IE8及更高版本中的兼容性与应用》 在Web开发过程中,兼容性问题始终是一个棘手的问题,尤其是对于那些老旧但仍然被广泛使用的浏览器,如Internet Explorer 8 (IE8)。Select2,作为一个强大的下拉框...

    IE兼容性插件

    6. **替代方案**:随着浏览器更新换代,现代浏览器已经普遍支持CSS3,对于不再需要支持旧版IE的项目,可以使用其他跨浏览器兼容库,如autoprefixer,它可以在编译时自动为CSS添加浏览器前缀,以确保广泛的浏览器兼容...

    IE浏览器,让大家分享下喔,全部初学者做开发使用

    因此,开发者需要学习如何使用条件注释、DOCTYPE声明以及各种前端框架(如Bootstrap)的IE兼容模式,以确保在IE上也能正确显示和运行网页。 其次,IE浏览器的开发工具对初学者来说是一个重要的学习资源。虽然不如...

    根据网络连接控制IE启动

    在描述中提到的“这是一款根据网络连接控制IE启动的小程序,通过VC编译”,表明这个程序是用Visual C++(简称VC)开发的。VC是微软公司提供的一种集成开发环境,支持C++语言,用于创建Windows平台的应用程序。使用VC...

    vc2005,2008与IE8不兼容处理包

    描述中的“VC自动建类时,出现的错误”可能是指当使用Visual Studio 2005或2008的向导或模板创建新类时,由于与IE8的不兼容,可能导致编译错误、运行时错误或设计时错误。这可能涉及到ActiveX控件、COM组件或者使用...

    西门子1000IE V3触摸屏回传

    但在Windows CE设备的外存储器和计算机中,除了存储已编译的项目文件,还可以保存压缩的源程序文件。这就使得可以在任何时间从操作员面板恢复出完整的项目,包括编译的项目文件和必须的源项目文件(*.hmi),从而...

    ie10 css hack 条件注释等兼容方式整理

    例如,IE浏览器支持`@cc_on`关键字,允许开发者在条件编译中使用JavaScript来实现特定版本的浏览器检测和处理。以下是一个使用`@cc_on`来为IE10添加特定类名的示例: ```html &lt;!--[if!IE]&gt;&lt;!--&gt; if(/*@cc_on!@*/...

    vb 锁ie插件原代码

    这个项目可能包含一个名为"lockie"的文件,它可能是VB源代码文件或编译后的执行文件,用于演示如何操作IE插件。 在VB中实现锁IE插件的功能,主要涉及到以下几个关键知识点: 1. **注册表操作**:IE插件的启用和...

    通过Jscript中@cc_on 语句识别IE浏览器及版本的代码

    `@cc_on`是JScript(JavaScript的一个变体,主要用于IE)中的一个条件编译指令,它用于开启条件编译功能。条件编译允许我们在代码中插入只对特定版本的IE执行的代码块,从而提高代码的兼容性和可维护性。在其他不...

    编写针对IE的JS代码两种编写方法

    在IE中,这些条件编译指令可以用来创建仅在IE环境下才执行的代码块。这段代码会被其他浏览器视为注释,从而忽略掉,不会影响非IE浏览器的正常运行。示例如下: ```javascript /*@cc_on @if (@_jscript) alert(...

    懒人锁ie源码

    9. **程序逻辑**:核心的锁定逻辑将涉及到一系列条件判断和操作,比如检查当前登录用户、锁定特定的IE设置、记录锁定状态等。 通过分析这个“懒人锁ie插件源代码”,开发者可以学习到如何利用VB来实现系统级别的...

    兼容ie及firefox的flash相册

    开发者可能使用了`&lt;object&gt;`或`&lt;embed&gt;`标签来在网页中插入Flash内容,并且可能使用了条件注释或其他技术来确保在不同浏览器中的正确显示。 `使用说明.txt`可能包含了如何部署和使用这个Flash相册的详细步骤,包括...

    易语言源码易语言IE扩展菜单源码.rar

    在本源码中,我们可以看到易语言是如何与IE浏览器进行交互,添加自定义菜单项并实现特定功能的。 1. **易语言基础**: 易语言提供了丰富的内置函数和对象,如窗口、控件、线程等,以及简单的语句结构,如赋值、...

Global site tag (gtag.js) - Google Analytics