IE中jscript/javascript的条件编译

http://tech.ddvip.com   2008年07月06日    社区交流

关键字: JScript

内容摘要:在IE中,有一个鲜为人知的功能叫做条件编译(conditional compilation)。自从IE4开始支持这个功能,它由于在一些Ajax相关的javascript脚本中出现而受到一些关注。

  你能够通过判断是否返回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
     }
   }
  @end
@*/if (!pageRequest && typeof XMLHttpRequest != 'undefined')
pageRequest = new XMLHttpRequest()
}

  使用条件编译,完整的try/catch块只用于IE5+, 其余的浏览器,比如IE4或非IE浏览器则试着破译它(dicipher it...这个dicipher是什么?“破译”这个解释是google到的,个人感觉翻译成“忽略”似乎更好?)。明显的Firefox会继续并使用XMLHttpRequest代替。现在你就得到了它--一个真正跨浏览器的ajax函数!(子乌注:在我翻译的另外一篇文章中,可以看到这个函数更全面的写法。)

来源:JavaScript Kit    责编:豆豆技术应用

正在加载评论...