javascript入門篇:變數和try catch()

來源:互聯網
上載者:User

E中有一個鮮為人知的功能,稱之為條件編譯(conditional compilation)。自IE4開始支援條件編譯至今,此功能逐漸得到更多人的關注,並運用在自己的JavaScript代碼中,甚至在一些Ajax代碼中也會經常發現它的身影。條件編譯允許由你控制IE瀏覽器是否執行你自訂的指令碼部分,而對其它瀏覽器沒有影響,其它瀏覽器只會將這些自訂指令碼視為普通的指令碼注釋。

文法概述
啟用條件編譯的關鍵詞為 /*@cc_on ,結束為 @*/ 。還可以使用邏輯語句如 @if 或 @set 。下面是一個簡單的例子:

<script type="text/javascript">
/*@cc_on alert("JScript版本: " + @_jscript_version);
/*@if (@_jscript_version >= 5) alert("這句話只有JScript版本為 5.0 或更高的瀏覽器才能看到"); @else @*/
alert("這句話能被其它瀏覽器看到(Firefox, Opera, IE 4.x etc)");
/*@end @*/ </script>


如果你使用IE瀏覽器(任何版本),你會看到第一個alert內容為“JScript版本:XX”
如果你使用IE5及以上的瀏覽器訪問,那麼會看到第二個alert內容為“JScript版本為 5.0 或更高”。
如果你使用其它瀏覽器,如Firefox,Opera,chrome,則只會看到第三個alert。
使用條件陳述式:@if, @elif, @else, @end
在條件編譯內附加聲明條件的語句:

@if
@elif 相當於其它文法中的elseif
@else
@end
讓我們看幾個“古怪”的例子:

if else 的邏輯 Ⅰ (僅用於IE)
/*@cc_on @if (@_win32) alert("作業系統是 32位. 瀏覽器是 IE."); @else alert("作業系統不是 32位. 瀏覽器是 IE."); @end @*/


判斷作業系統是否為32位,且整個指令碼只在IE下執行,而忽略所有其它瀏覽器。接下來,讓我們仔細對比一下上面的例子與下面這個例子的差異:

if else 的邏輯 Ⅱ (同時適用其它瀏覽器)
/*@cc_on @if (@_win32) alert("作業系統是 32位. 瀏覽器是 IE."); @else @*/ alert("瀏覽器不是 IE 或 作業系統不是32位"); /*@end @*/


通過操縱注釋標記的位置,讓上面這個例子支援判斷非IE瀏覽器。第二個alert會被所有不是32位系統或是非IE瀏覽器執行。只有研究到頭都大了,你才會發現注釋邏輯的奧妙 : )

if,elseif,else 的邏輯 Ⅰ (僅用於IE)
/*@cc_on @if (@_jscript_version >= 5) alert("當前IE瀏覽器支援JScript 5+"); @elif (@_jscript_version >= 4) alert("當前IE瀏覽器支援JScript 4+"); @else alert("你的IE是文物嗎?"); @end @*/


if,elseif,else 的邏輯 Ⅱ (同時適用其它瀏覽器)
/*@cc_on /*@if (@_jscript_version >= 5) alert("當前IE瀏覽器支援JScript 5+"); @elif (@_jscript_version >= 4) alert("當前IE瀏覽器支援4+"); @else @*/ alert("非IE瀏覽器(一個不支援JScript的瀏覽器)"); /*@end @*/


在最後一個例子中,注意最後一個else的寫法,這似的非IE瀏覽器也參與到判斷中來。


js變數


文法概述
啟用條件編譯的關鍵詞為
/*@cc_on ,結束為 @*/ 。還可以使用邏輯語句如 @if 或 @set 。下面是一個簡單的例子:

<script type="text/javascript"> /*@cc_on alert("JScript版本: " + @_jscript_version); /*@if (@_jscript_version >= 5) alert("這句話只有JScript版本為 5.0 或更高的瀏覽器才能看到"); @else @*/ alert("這句話能被其它瀏覽器看到(Firefox, Opera, IE 4.x etc)"); /*@end @*/ </script>


如果你使用IE瀏覽器(任何版本),你會看到第一個alert內容為“JScript版本:XX”
如果你使用IE5及以上的瀏覽器訪問,那麼會看到第二個alert內容為“JScript版本為 5.0 或更高”。
如果你使用其它瀏覽器,如Firefox,Opera,chrome,則只會看到第三個alert。
使用條件陳述式:@if, @elif, @else, @end
在條件編譯內附加聲明條件的語句:

@if
@elif 相當於其它文法中的elseif
@else
@end
讓我們看幾個“古怪”的例子:

if else 的邏輯 Ⅰ (僅用於IE)
/*@cc_on @if (@_win32) alert("作業系統是 32位. 瀏覽器是 IE."); @else alert("作業系統不是 32位. 瀏覽器是 IE."); @end @*/


判斷作業系統是否為32位,且整個指令碼只在IE下執行,而忽略所有其它瀏覽器。接下來,讓我們仔細對比一下上面的例子與下面這個例子的差異:

if else 的邏輯 Ⅱ (同時適用其它瀏覽器)
/*@cc_on @if (@_win32) alert("作業系統是 32位. 瀏覽器是 IE."); @else @*/ alert("瀏覽器不是 IE 或 作業系統不是32位"); /*@end @*/


通過操縱注釋標記的位置,讓上面這個例子支援判斷非IE瀏覽器。第二個alert會被所有不是32位系統或是非IE瀏覽器執行。只有研究到頭都大了,你才會發現注釋邏輯的奧妙 : )

if,elseif,else 的邏輯 Ⅰ (僅用於IE)
/*@cc_on @if (@_jscript_version >= 5) alert("當前IE瀏覽器支援JScript 5+"); @elif (@_jscript_version >= 4) alert("當前IE瀏覽器支援JScript 4+"); @else alert("你的IE是文物嗎?"); @end @*/


if,elseif,else 的邏輯 Ⅱ (同時適用其它瀏覽器)
/*@cc_on /*@if (@_jscript_version >= 5) alert("當前IE瀏覽器支援JScript 5+"); @elif (@_jscript_version >= 4) alert("當前IE瀏覽器支援4+"); @else @*/ alert("非IE瀏覽器(一個不支援JScript的瀏覽器)"); /*@end @*/


在最後一個例子中,注意最後一個else的寫法,這似的非IE瀏覽器也參與到判斷中來。


try catch()


在第一節的開始,我就曾經提起過條件編譯被越來越多的用在Ajax中。現在我就要解釋為什麼會這樣。不同瀏覽器提供的非同步請求的對象不同,導致了一個完善的Ajax程式必須在核心函數中先判斷當前瀏覽器的種類及版本。

一段典型的Ajax代碼執行個體可以幫你瞭解這些:

function HttpRequest(url, parameters){
var pageRequest = false //定義獲得Ajax對象的變數,並賦初始值(好習慣) if (window.XMLHttpRequest) // mozilla系如Firefox,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或其它類似的瀏覽器。Firefox及其它支援標準的瀏覽器很顯然會使用XMLHttpRequest。於是,你得到了一個真正實現合理跨瀏覽器啟動並執行Ajax函數!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.