> 웹 프론트엔드 > JS 튜토리얼 > IE_javascript 기술에서 jscript/javascript의 조건부 컴파일

IE_javascript 기술에서 jscript/javascript의 조건부 컴파일

WBOY
풀어 주다: 2016-05-16 19:26:27
원래의
1430명이 탐색했습니다.

IE中jscript/javascript的条件编译

条件编译概述

  在IE中,有一个鲜为人知的功能叫做条件编译。自从IE4开始支持这个功能,它由于在一些Ajax相关的javascript脚本中出现而受到一些关注。条件编译作为一种独立形式的对象判断,使得IE可以根据预定义或用户定义的条件来决定你的jscript或javascript代码特定部分是否编译。也可以把它看成是你的代码的条件注释,使你的代码能够在非IE浏览上也顺利运行。

语法概述

  通过在你的脚本中使用<span title="代码">@cc_on</span>来激活条件编译,或者直接使用<span title="代码">@if</span>或者<span title="代码">@set</span>等等作为CC逻辑中一部分的句子来激活它。这里是一个示范例子:

Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
  1.  
例子:
JScript 版本: 5.6.
JScript 版本 5.0+.
只有当浏览器支持JScript5+的时候你才能看到这些文字。

  如果你使用IE(任何版本),你应该能够看到第一个<span title="代码">document.write()</span>的输出,如果是IE5+,接下来的两个<span title="代码">document.write()</span>你也能够看见(因为从IE5开始支持JScript 5)。最后一个<span title="代码">document.write()</span>方法是为了其他非IE5+浏览器服务的,无论是Firefox,opera,IE4,或者什么别的。条件编译依赖于类似在条件注释中使用的注释标签,以确保它在所有浏览器中都能工作顺畅。

  当使用条件编译的时候,最好先通过<span title="代码">@cc_on</span>语句来激活它,只有这样你才能在你的脚本中包含注释标签以保证浏览器兼容,、就好像上面例子中所显示的那样。(子乌注:这句英文我翻译的不是很顺...看起来似乎与上面的句子矛盾)

@if, @elif, @else,@end 语句

在这个奇怪的开场白之后,这里是一些用于条件便于的条件语句:

  • @if
  • @elif
  • @else
  • @end

现在让我们看一些“古怪”的例子。

if else 逻辑 (排除IE外的浏览器)
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. /*@cc_on
  2.    @if (@_win32)
  3.       document.write("操作系统是32位windows。浏览器是IE。");
  4.    @else
  5.       document.write("操作系统不是32位windows。浏览器是IE。");
  6.    @end
  7. @*/
  8.  

  这是一段完整的脚本,只被ie浏览器所识别并忽略其他所有浏览器,这段脚本在不同的操作系统上将显示不同的内容。对比一下下面这个例子……

if else 逻辑2 (包含其他浏览器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
  1. /*@cc_on
  2.    /*@if (@_win32)
  3.       document.write("操作系统是32位windows。浏览器是IE。");
  4.    @else @*/
  5.       document.write("浏览器不是IE (如: Firefox)或者浏览器不是在32位windows下的IE。");
  6.    /*@end
  7. @*/
  8.  

  熟练使用注释标签,这个例子中的<span title="代码">else</span>部分能够包含所有的非ie浏览器(如firefox),以及非32位windows下的IE。努力的研究这段注释,直到你脑袋发昏,你就会明白这个逻辑了:)

if, elseif, else逻辑 (排除IE外的浏览器)

  继续吧,可以看全部内容了:

Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. /*@cc_on
  2.    @if (@_jscript_version >= 5)
  3.       document.write("IE Browser that supports JScript 5+");
  4.    @elif (@_jscript_version >= 4)
  5.       document.write("IE Browser that supports JScript 4+");
  6.    @else
  7.       document.write("Very old IE Browser");
  8.    @end
  9. @*/
  10.  
if, elseif, else 逻辑2(包含其他浏览器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
  1. /*@cc_on
  2.    /*@if (@_jscript_version >= 5)
  3.       document.write("IE Browser that supports JScript 5+");
  4.    @elif (@_jscript_version >= 4)
  5.       document.write("IE Browser that supports JScript 4+");
  6.    @else @*/
  7.       document.write("Non IE Browser (one that doesn't support JScript)");
  8.    /*@end
  9. @*/
  10.  

  全面的处理。在这最后一个例子中,最后一个<span title="代码">else</span>语句包含了所有非IE浏览器。

条件编译变量

  在之前一部分中你看到了一些奇怪变量比如<span title="代码">@_win32</span>。这是一些你能够用来判断IE或计算机大致描述的预定义条件编译变量:

预定义的条件编译变量
变量 描述
@_win32 当运行在一个win32系统中时返回true, 否则返回 NaN.
@_win16 当运行在一个win16系统中时返回true , 否则返回 NaN.
@_mac 当运行在一个Apple的Macintosh系统中时返回 true , 否则返回 NaN.
@_alpha 当运行于DEC aplha处理器上时返回true ,否则返回 NaN.
@_x86 当运行于一个Intel处理上时返回true ,否则返回 NaN.
@_mc680x0 运行于Motorola 680x0处理器上时 true , 否则返回 NaN.
@_PowerPC 运行于Motorola PowerPC处理器上时 true , 否则返回 NaN.
@_jscript 永远返回 true.
@_jscript_build JScript脚本引擎编译次数.
@_jscript_version Jscript版本,以主要版本.次要版本格式展现.

IE4 支持JScript 3.x
IE5.x 支持 JScript  5.5-
IE6 支持 JScript 5.6

在JScript.net,这个版本数为7.x.
@_debug 如果编译于debug模式则返回 true ,否则返回false.
@_fast 如果编译于fast模式则返回 true ,否则返回false.

  在大多数情况下,你也许只需要使用<span title="代码">@_win</span><span title="代码">@jscript_build</span>:

Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. /*@cc_on
  2.    @if (@_win32)
  3.       document.write("OS is 32-bit. Browser is IE.");
  4.    @else
  5.       document.write("OS is NOT 32-bit. Browser is IE.");
  6.    @end
  7. @*/
  8.  

用户自定义变量

  你也可以在条件编译块中定义你自己的变量,语法如下:

Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. @set @varname = term
  2.  

  在条件编译中,数字布尔类型的变量可以使用,但字符型无法使用。比如:

Language:javascript, parsed in: 0.002 seconds, using GeSHi 1.0.7.12
  1. @set @myvar1 = 35
  2. @set @myvar3 = @_jscript_version
  3.  

在条件编译逻辑中能够使用标准的运算符:

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

  你能够通过判断是否返回<span title="代码">NaN</span>来确定是否定义了一个用户自定义变量:

Language:javascript, parsed in: 0.002 seconds, using GeSHi 1.0.7.12
  1. @if (@newVar != @newVar)
  2. //该变量未定义
  3.  

由于<span title="代码">NaN</span>是唯一一个不等于其自身的值,所以这段脚本能够正常运行。

条件编译示例--try catch语句

  在教程的开始,我曾经提及条件编译如何由于在一些Ajax的JavaScript中的出现而显示出它值得自夸的一面。现在我要告诉你我所指的内容。一个Ajax脚本通常包含一个中心函数用于判断浏览器(ie、ff等)对产生异步请求对象的支持:

典型的ajax函数:

Language:javascript, parsed in: 0.020 seconds, using GeSHi 1.0.7.12
  1. function HttpRequest(url, parameters){
  2. var pageRequest = false //variable to hold ajax object
  3.    if (window.XMLHttpRequest) // if Mozilla, Safari etc
  4.       pageRequest = new XMLHttpRequest()
  5.    else if (window.ActiveXObject){ // if IE
  6.       try {
  7.       pageRequest = new ActiveXObject("Msxml2.XMLHTTP")
  8.       }
  9.       catch (e){
  10. 해 보세요{
  11. pageRequest = new ActiveXObject("Microsoft.XMLHTTP")
  12.  }
  13. 잡다 (e){}
  14. }
  15. }
  16. 그밖에
  17. 반품 거짓
  18. }

많은 사람들이 <span title="code">try/catch<code><span title="代码">try/catch</span> 문으로 Ajax 지원을 성공적으로 테스트할 수 있다고 생각하지만 이는 사실이 아닙니다. IE 4.x 등 <span title="code">throw/catch<code><span title="代码">throw/catch</span>를 지원하지 않는 브라우저에서는 실제로 위 코드를 차단하고 오류를 반환합니다. 이 문제를 극복하기 위해 조건부 컴파일을 사용하여 진정한 크로스 브라우저 친화적인 Ajax 핸들러를 만들 수 있습니다.

진정한 크로스 브라우저 기능:

언어: javascript, 구문 분석 시간: 0.008초, GeSHi 1.0.7.12 사용
  1. 함수 HttpRequest(url, 매개변수){
  2. var pageRequest = false //Ajax 객체를 담을 변수
  3. /*@cc_on
  4. @if (@_jscript_version >= 5)
  5. 시도해 보세요 {
  6. pageRequest = new ActiveXObject("Msxml2.XMLHTTP")
  7. }
  8. 잡기(e){
  9. 시도해 보세요 {
  10. pageRequest = new ActiveXObject("Microsoft.XMLHTTP")
  11. }
  12. 캐치(e2){
  13. 페이지 요청 = false
  14. }
  15. }
  16. @end
  17. @*/
  18. if (!pageRequest && typeof XMLHttpRequest != '정의되지 않음')
  19. pageRequest = new XMLHttpRequest()
  20. }

조건부 컴파일을 사용하면 완전한 <span title="code">try/catch<code><span title="代码">try/catch</span> 블록은 IE5에만 사용되며, IE4나 IE가 아닌 브라우저와 같은 다른 브라우저는 이를 해독하려고 합니다. (dicipher it... 이 dicipher는 무엇인가요? "decipher"에 대한 설명은 google에서 찾았습니다. 개인적으로 "ignore"로 번역하는 것이 더 낫다고 생각합니다.) 분명히 Firefox는 계속해서 XMLHttpRequest를 대신 사용할 것입니다. 이제 진정한 크로스 브라우저 Ajax 기능을 얻을 수 있습니다! ( Ziwu의 메모: 이 함수를 작성하는 더 포괄적인 방법은 제가 번역한 다른 기사 에서 볼 수 있습니다. )

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿