IE中jscript/javascript的條件編譯
條件編譯概述
在IE中,有一個鮮為人知的功能叫做條件編譯。自從IE4開始支持這個功能,它由于在一些Ajax相關的javascript腳本中出現而受到一些關注。條件編譯作為一種獨立形式的對象判斷,使得IE可以根據預定義或用戶定義的條件來決定你的jscript或javascript代碼特定部分是否編譯。也可以把它看成是你的代碼的條件注釋,使你的代碼能夠在非IE瀏覽上也順利運行。
語法概述
通過在你的腳本中使用@cc_on來激活條件編譯,或者直接使用@if或者@set等等作為CC邏輯中一部分的句子來激活它。這里是一個示范例子:
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
<script type="text/javascript">
/*@cc_on
document.write("JScript 版本: " + @_jscript_version + ".<br>");
/*@if (@_jscript_version >= 5)
document.write("JScript 版本 5.0+.<br //>");
document.write("只有當瀏覽器支持JScript5+的時候你才能看到這些文字.<br>");
@else @*/
document.write("當你使用其他瀏覽器(比如: Firefox, IE 4.x 之類)的時候看到這行文字<br>");
/*@end
@*/
</script>
例子:
JScript 版本: 5.6.
JScript 版本 5.0+.
只有當瀏覽器支持JScript5+的時候你才能看到這些文字。
如果你使用IE(任何版本),你應該能夠看到第一個document.write()的輸出,如果是IE5+,接下來的兩個document.write()你也能夠看見(因為從IE5開始支持JScript 5)。最后一個document.write()方法是為了其他非IE5+瀏覽器服務的,無論是Firefox,opera,IE4,或者什么別的。條件編譯依賴于類似在條件注釋中使用的注釋標簽,以確保它在所有瀏覽器中都能工作順暢。
當使用條件編譯的時候,最好先通過@cc_on語句來激活它,只有這樣你才能在你的腳本中包含注釋標簽以保證瀏覽器兼容,、就好像上面例子中所顯示的那樣。(子烏注:這句英文我翻譯的不是很順...看起來似乎與上面的句子矛盾)
@if, @elif, @else,@end 語句
在這個奇怪的開場白之后,這里是一些用于條件便于的條件語句:
現在讓我們看一些“古怪”的例子。
if else 邏輯 (排除IE外的瀏覽器)
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
/*@cc_on
@if (@_win32)
document.write("操作系統是32位windows。瀏覽器是IE。");
@else
document.write("操作系統不是32位windows。瀏覽器是IE。");
@end
@*/
這是一段完整的腳本,只被ie瀏覽器所識別并忽略其他所有瀏覽器,這段腳本在不同的操作系統上將顯示不同的內容。對比一下下面這個例子……
if else 邏輯2 (包含其他瀏覽器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
/*@cc_on
/*@if (@_win32)
document.write("操作系統是32位windows。瀏覽器是IE。");
@else @*/
document.write("瀏覽器不是IE (如: Firefox)或者瀏覽器不是在32位windows下的IE。");
/*@end
@*/
熟練使用注釋標簽,這個例子中的else部分能夠包含所有的非ie瀏覽器(如firefox),以及非32位windows下的IE。努力的研究這段注釋,直到你腦袋發昏,你就會明白這個邏輯了:)
if, elseif, else邏輯 (排除IE外的瀏覽器)
繼續吧,可以看全部內容了:
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
/*@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 邏輯2(包含其他瀏覽器)
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
/*@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或計算機大致描述的預定義條件編譯變量:
預定義的條件編譯變量| 變量 | 描述 |
|---|
| @_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. |
在大多數情況下,你也許只需要使用@_win和@jscript_build:
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
/*@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
@*/
用戶自定義變量
你也可以在條件編譯塊中定義你自己的變量,語法如下:
Language:javascript, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
@set @varname = term
在條件編譯中,數字與布爾類型的變量可以使用,但字符型無法使用。比如:
Language:javascript, parsed in: 0.002 seconds, using GeSHi 1.0.7.12
@set @myvar1 = 35
@set @myvar3 = @_jscript_version
在條件編譯邏輯中能夠使用標準的運算符:
- ! ~
- * / %
- + -
- << >> >>>
- < <= > >=
- == != === !==
- & ^ |
- && |
你能夠通過判斷是否返回NaN來確定是否定義了一個用戶自定義變量:
Language:javascript, parsed in: 0.002 seconds, using GeSHi 1.0.7.12
@if (@newVar != @newVar)
//該變量未定義
由于NaN是唯一一個不等于其自身的值,所以這段腳本能夠正常運行。
條件編譯示例--try catch語句
在教程的開始,我曾經提及條件編譯如何由于在一些Ajax的JavaScript中的出現而顯示出它值得自夸的一面。現在我要告訴你我所指的內容。一個Ajax腳本通常包含一個中心函數用于判斷瀏覽器(ie、ff等)對產生異步請求對象的支持:
典型的ajax函數:
Language:javascript, parsed in: 0.020 seconds, using GeSHi 1.0.7.12
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處理函數:
真正的跨瀏覽器函數:
Language:javascript, parsed in: 0.008 seconds, using GeSHi 1.0.7.12
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函數!(子烏注:在我翻譯的另外一篇文章中,可以看到這個函數更全面的寫法。)