`

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的条件编译

    IE中jscript/javascript的条件编译 作者:JavaScript Kit 译者:子乌(Sheneyan) 翻译日期:2006-02-12 英文原文:Conditional Compilation of JScript/ JavaScript in IE 版权:翻译未经过javascript kit同意,我只对我所...

    JScript的条件编译

    var s=0//@cc_on+1 在IE中等同于: var s=0+1 条件编译为在注释中运行代码提供了途径。 一般我们在编写JavaScript代码时很少用到条件编译。不过条件编译由于其本身的特性,对我们检测系统,自动识别浏览器编程却...

    IE10 CSS Hack介绍及IE11的CSS Hack提前了解

    我们可以用IE私有的条件编译(conditional compilation)结合条件注释来提供针对ie10的Hack:该脚本里面的IE排除条件注释,以确保IE6-9不承认它,然后它功能检测到了名为@ cc_on。 复制代码代码如下: &lt;!–[if !IE]...

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

    @cc_on 备注 @cc_on 语句激活脚本引擎中的条件编译。 强烈推荐在注释中使用 @cc_on 语句,以使不支持条件编译的浏览器将您的脚本视为有效语法而接受它: /*@cc_on*/ // The remainder of the script.或者,在注释外...

    VoiceIE语音浏览系统ICP开发指南 用户手册.doc

    2.2.3 Form Item的变量和条件 2-4 2.2.4 引导型Form 2-5 2.2.5 混合引导型Form 2-7 2.2.6 Form的解释规则 2-7 2.3 MENU 2-10 2.4 LINK 2-15 2.5 变量和表达式 2-17 2.5.1 变量的声明 2-17 2.5.2 变量的范围 2-18 ...

    条件CSS基本使用方法

    条件 CSS 是这个问题的一个解决方案,采用的是 Internet Explorer 的条件注释语法的思想,并把它内联到 CSS 声明之中。 基本用法 条件 CSS 主要用于指出一个特别的 CSS 声明是不是应该用于一个特别的浏览器。当然你...

    详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)

    由于Iview编译使用到了es6的一些新特性,Internet Explorer所有版本中都会报错,缺少includes、findIxdex等问题。 本人研究涉及到的环境:VueCli3.2 + iview 3.1.5 在IE中不支持ES6的新特性,例如:includes、find...

    JsMinGUI

    JsMinGUI &lt;br&gt;功能介绍: 1、它可以向命令行版本一样,采用图形界面操作来完成压缩一个 JavaScript 脚本文件。 2、输入文件可以和... 7、比原版的 JsMin 增加了对注释中 IE 条件编译语句压缩的支持。

    Java程序设计复习题2.doc

    5) } 6) } A) 第2行 B) 第3行 C) 第4行 D) 第6行 16、下列各种java中的条件语句,那种在java语言中是错误的条件格式? A) if (A &gt;= B) B) if( A = = B) C) if( A = B) D) if((A &gt;B) = =true) 17、下列Java常见事件...

    专科计算机应用基础作业二.doc

    A:电子邮件 B:www浏览 C:程序编译 D:文件传输 21、下列关于退出IE浏览器的操作,不正确的是___B______。 A:直接在页面上单击右键,按"退出程序"按钮 B:右击任务栏中的IE按钮,在弹出的列表菜单中单击"关闭",可...

    ts-failable:Typescript的类型安全错误处理库

    结果为什么在Typescript中,无法检查函数在编译时可能引发的异常类型。 捕获异常时,您会得到类型any的值。 您可以编码一个结果类型Either / Result类型象Haskell或生锈,它们可以是一个成功值或失败

    Benchmark-Algorithms:Java中的Sorting Algorithms基准测试应用程序

    使用javac编译ie / gmit / dip / *。java运行-&gt; ie.gmit.dip.Benchmarker 图形输出屏幕 表格输出 我们正在对引入的算法进行基准测试,方法是创建从250个最大到10,000个整数的各种输入大小的随机数数组,并根据...

    pbtest:Purplebricks-技术测试

    要在构建过程之前查看未优化的代码(和演示),请访问: : ##构建笔记使用Grunt,Bootstrap和Modernizr与Yeoman搭架在实时验证中添加(在满足条件之前,禁用提交按钮) ##去做浏览器测试(针对IE8的优化) 研究...

    精通AngularJS part1

    通过编译函数中的transcludeFn来获取嵌入函数252 通过$transclude在指令控制器中获取嵌入函数253 使用嵌入创建一个if指令253 在指令中使用priority属性255 93理解指令控制器256 为指令控制器注入特殊依赖257 ...

    《计算机应用基础》(2).doc

    想保存某个网址或网页,可以使用IE浏览器中的____菜单下的____命令( A ) A、"文件"、"另存为" B、"编辑"、"保存" C、"收藏"、"另存为" D、"查看"、"保存" 20. 下面是某单位主页的Web地址URL,其中符合URL格式的是...

    ChildGuard.zip

    'do_kill':1, #满足black_list、condition_browser相关条件,是否kill 'seconds':10, #默认每次录音多少秒 'snap_dir':'snap/', #抓取的截图和录音,放置的目录位置 'hide':0, #是否隐藏自己 }

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    3.8.11 条件编译&条件属性 60 3.9 本章总结 61 第4章 服务器控件属性 62 4.1 控件属性的作用 62 4.1.1 系统属性 62 4.1.2 自定义属性 62 4.2 简单属性 63 4.3 属性的设计时特性 64 4.4 复杂属性 67 4.4.1 ...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    3.8.11 条件编译&条件属性 60 3.9 本章总结 61 第4章 服务器控件属性 62 4.1 控件属性的作用 62 4.1.1 系统属性 62 4.1.2 自定义属性 62 4.2 简单属性 63 4.3 属性的设计时特性 64 4.4 复杂属性 67 4.4.1 ...

Global site tag (gtag.js) - Google Analytics