`
xiaozhi7616
  • 浏览: 196624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript中的条件编译

阅读更多

本人英文水平有限,不足之处是必然的,欢迎大家批评指正。

 

条件编译介绍


在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 变量

/*@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

 

条件编译 同样支持数字类型和布尔类型的变量,但是不支持 字符串 变量。例如:

@set @myvar1 = 35
@set @myvar3 = @_jscript_version

 

条件编译 中的标准 逻辑运算符 集合:

  • ! ~
  • * / %
  • + -
  • << >> >>>
  • < <= > >=
  • == != === !==
  • & ^ |
  • && |

 

可以测试一下如果用户定义一个变量,并且值为NaN:

@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

 

 

 

9
0
分享到:
评论
6 楼 晴1天 2009-08-04  
解释性的语言 也要这东西吗   多余
5 楼 windywany 2009-08-04  
程序员都不要求标准,那就更不标准了.
4 楼 xiaozhi7616 2009-07-28  
javaDevil 写道
意义不大,估计也是IE Only


IE Only 倒是真的,在其他浏览器中遇到它就会直接跳过去执行下面的语句,但正式因为这一点可以达到我们的目的,在IE和其他的浏览器中以示区别。

并不是所有的 IE Only 都不好,不能一棒子打死,巧妙的利用还是能解决很多的问题的。
3 楼 xiaozhi7616 2009-07-28  
javaDevil 写道
意义不大,估计也是IE Only


其实主要就是用在创建 XMLHttpRequest 对象的时候,根据不同的浏览器,创建的方法不一样,现在用了很多的框架,像Prototype,Dojo之类的,这个创建过程早就被封装好了,用到这些语句的机会就更少了。

就是看到了这一块,还不是很清楚它的意思,拿出来大家共同看一下
2 楼 javaDevil 2009-07-28  
意义不大,估计也是IE Only
1 楼 liu78778 2009-07-28  
又多了解了一点, 这方面之前还真没看到过, 谢了

相关推荐

    IE中的条件编译

    在编写HTML、CSS或JavaScript时,可以通过特定的语法结构实现条件编译,以便在不同的IE版本中执行不同的代码段。 条件注释(Conditional Comments)是IE特有的一个功能,它允许在HTML文档中插入只有IE浏览器会识别...

    ifdef-loader:用于JavaScriptTypeScript条件编译的Webpack加载器

    Webpack加载器,可直接从Webpack进行JavaScript或TypeScript条件编译( #if ... #elif ... #else ... #endif )。 有条件的编译指令写在///三斜杠注释中,这样它们就不会影响普通JavaScript或TypeScript解析。 ...

    IE中jscript/javascript的条件编译

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

    android.bp动态编译文档

    2. **引入条件编译**:在`Android.bp`中,我们可以使用`if`语句来根据特定条件决定是否编译某个模块。例如,如果一个模块只在特定的设备或产品变体上存在,我们可以在`if`语句中检查这些条件。 ```javascript if ...

    这是一个编程语言无关的条件编译插件

    总结来说,这个“编程语言无关的条件编译插件”提供了一种跨语言的解决方案,帮助开发者在多种环境中进行条件编译,简化多平台或多版本开发的复杂性。通过集成在开发工具中,它使得代码的管理和构建变得更加灵活,...

    rhubarb:javascript的条件编译工具

    大黄javascript的条件编译工具进行自定义构建的野蛮人方式它有什么作用? 它需要源代码 if ( Whatever . hasFeature ( "foo" ) ) {doFunctionFoo ( ) ;} else {console . log ( "I haven't feature foo!" ) ;}if ( _...

    rollup-plugin-jscc:用于汇总的条件编译和编译时变量替换

    汇总插件jscc 条件编译和编译时变量替换。 rollup-plugin-jscc不是编译器,的包装,这是一个小巧而功能强大的,与语言无关的文件预处理器,在编译时使用JavaScript来基于表达式转换文本。 使用jscc,您可以: 根据...

    简单记录C# 条件编译

    您可能感兴趣的文章:C# 编译生成dll文件供程序调用的两种方法C# #define条件编译详解C#实现将javascript文件编译成dll文件的方法C#命令行编译器配置方法C#中尾递归的使用、优化及编译器优化手动编译C#代码的方法

    JavaScript中文帮助文档

    JavaScript中文帮助文档是针对中文使用者编译的一份详尽参考资料,它涵盖了JavaScript的基本语法、数据类型、控制流程、函数、对象、DOM操作、事件处理、AJAX异步通信、浏览器兼容性问题等多个方面。这份文档的存在...

    JavaScript中文手册CHM

    JScript 基础 什么是 Jscript? 编写 JScript 代码 JScript 变量 JScript 数据类型 JScript 运算符 ...条件编译 条件编译变量 JScript 函数 JScript 对象 固有对象 创建自己的对象 JScript 保留字

    JavaScript.中文学习文档

    - **简单性**:JavaScript 作为一种脚本语言,无需编译,可以在浏览器中直接运行,使得开发过程更为简便。 - **动态性**:能够直接响应用户的输入和操作,无需服务器端处理,提高了用户体验。 - **跨平台性**:...

    Javascript参考手册中文版chm版

    JavaScript的核心概念包括变量、数据类型(如字符串、数字、布尔值、null和undefined)、运算符(算术、比较和逻辑运算符)、控制流(条件语句、循环、函数调用)以及对象和数组。手册中可能详细解释了这些基础概念...

    JavaScript中if与case比较

    `if`语句是JavaScript中最基本的条件语句之一,用于基于特定条件执行一段代码。它可以是简单的`if`语句,也可以扩展为`if-else`和`if-else if-else`结构,以处理更复杂的逻辑。 **基本格式**: ```javascript if ...

    JavaScript内核系列 pdf

    JavaScript语法基于ECMAScript规范,包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、对象、数组等)、运算符(算术、比较、逻辑、位运算等)、流程控制(条件语句、循环结构)以及函数等。...

    Webpack插件用于验证编译中所有外部依赖项的许可证并将它们输出到文件中

    这就是"Webpack插件用于验证编译中所有外部依赖项的许可证并将它们输出到文件中"这一主题的核心所在。 这个插件的主要功能是检查项目在编译过程中所依赖的所有外部模块的许可证信息,并将这些信息整理后写入文件,...

    js模板编译原理

    - 当模板中包含循环或条件语句时(如`(var i = 0; i ; i++) { %&gt;`),模板引擎还需要生成相应的JavaScript逻辑代码。 - 例如,针对以下模板: ```html (var i = 0; i ; i++) { %&gt; (!posts[i].expert) { %&gt; ...

    JavaScript学习基础学习心得

    - **解释性语言**:JavaScript代码不需要提前编译,在运行时逐行解释执行。 - **单线程**:JavaScript的核心执行模型是单线程的,这意味着同一时间只能执行一个任务。 #### 如何引入JavaScript JavaScript可以通过...

    java反编译(将class文件反向编译成java源文件)

    3. **Procyon**:另一个开源的Java反编译器,它不仅支持反编译,还支持Java、JavaScript和CoffeeScript的编译。Procyon在处理复杂的字节码结构时表现出色。 4. **FernFlower**:这是一个简单的Java反编译器,以生成...

    javascript傻瓜教程PPT

    JavaScript提供了条件语句(如if...else)、循环语句(如for、while)以及函数定义,用于实现逻辑控制和代码复用。 4. **对象与函数** JavaScript是一种基于原型的对象导向语言,所有数据都是对象。函数不仅是代码...

    JScript的条件编译

    条件编译可以帮助开发者在支持这些特性的浏览器中使用它们,同时确保在不支持的环境中代码依然能够正常运行。 **示例:** ```javascript //@cc_on var x = "hello"; // 使用ES6模板字符串 alert(`The value is ${x}...

Global site tag (gtag.js) - Google Analytics