IE中的JavaScript条件编译之三:例子 - try/catch语句

英文原作:Conditional Compilation of JScript/ JavaScript in IE

中文翻译:L卡片

与CSS hacker一样,善用CC可做JS hacker,对解决源自JavaScript的浏览器兼容很有帮助。

为更好解释条件编译,译者对描述及代码实例做了部分修改,并擅自去掉了标题的“JScript”。

如果没看上一节,先点这里:IE中的JavaScript条件编译之二:变量

在第一节的开始,我就曾经提起过条件编译被越来越多的用在Ajax中。现在我就要解释为什么会这样。不同浏览器提供的异步请求的对象不同,导致了一个完善的Ajax程序必须在核心函数中先判断当前浏览器的种类及版本。

一段典型的Ajax代码实例可以帮你了解这些:

function HttpRequest(url, parameters){
var pageRequest = false //定义获得Ajax对象的变量,并赋初始值(好习惯)
   if (window.XMLHttpRequest)
   // mozilla系如火狐,webkit系如Safari和chrome,还有Opera支持这个对象
      pageRequest = new XMLHttpRequest()
   else if (window.ActiveXObject){ // 只有IE支持,而且不只一种
      try {
      pageRequest = new ActiveXObject("Msxml2.XMLHTTP")
      } 
      catch (e){
         try{
         pageRequest = new ActiveXObject("Microsoft.XMLHTTP")
         }
         catch (e){}
      }
   }
   else
   return false
}

大多数人都认为上面这段脚本在IE下能成功执行。但很遗憾,事实并非如此。某些浏览器不支持"throw/catch"的浏览器,如万恶的IE系列的小四(IE 4.x)。这些不支持抛出获取的浏览器将会在抛出前中断并返回一个错误。为了解决这个缺陷,我们用条件编译将上述代码重写成一个真正实现合理跨浏览器运行的Ajax函数:

真正实现合理跨浏览器运行的Ajax函数

function HttpRequest(url, parameters){
var pageRequest = false //定义获得Ajax对象的变量,并赋初始值(好习惯)
/*@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()
}

因为只需针对IE5及以上的浏览器使用try/catch那部分判断,所以用条件编译将之与正常的判断区分开。而实际情况是很少会遇到IE4或其它类似的浏览器。火狐及其它支持标准的浏览器很显然会使用XMLHttpRequest。于是,你得到了一个真正实现合理跨浏览器运行的Ajax函数!

至此全文结束,感谢所有忍受L卡片 擅自修改原文的翻译风格。条件编译还有很多神奇的用法,本文作为入门引导的文章并未深入展开,更多实例可google一下。条件编译的翻译到此结束,而未来我还将翻译一些我认为有价值的知识点。希望这篇能成为目前CC最好的翻译。最后感谢google字典提供帮助。

Top↑