還記得幾年前的那些討厭的浏覽器戰爭嗎?沒有一樣東西在不同的浏覽器上得到同樣的結果。不管您是否相信,這些戰爭仍然在繼續,雖然規模較小。但令人奇怪的是,XMLHttpRequest 成了這場戰爭的犧牲品之一。因此獲得 XMLHttpRequest 對象可能需要采用不同的方法。下面我將詳細地進行解釋。
使用 Microsoft 浏覽器Microsoft 浏覽器 Internet Explorer 使用 MSXML 解析器處理 XML。因此如果編寫的 AJax 應用程序要和 Internet Explorer 打交道,那麼必須用一種特殊的方式創建對象。
但並不是這麼簡單。根據 Internet Explorer 中安裝的 JavaScript 技術版本不同,MSXML 實際上有兩種不同的版本,因此必須對這兩種情況分別編寫代碼。請參閱如下代碼,其中的代碼在 Microsoft 浏覽器上創建了一個 XMLHttpRequest。
var XMLHttp = false;
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
XMLHttp = false;
}
}
現在只要牢牢記住其中的兩行代碼:
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");和
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");這兩行代碼基本上就是嘗試使用一個版本的 MSXML 創建對象,如果失敗則使用另一個版本創建該對象。不錯吧?如果都不成功,則將 XMLHttp 變量設為 false,告訴您的代碼出現了問題。如果出現這種情況,可能是因為安裝了非 Microsoft 浏覽器,需要使用不同的代碼。
處理 Mozilla 和非 Microsoft 浏覽器如果選擇的浏覽器不是 Internet Explorer,或者為非 Microsoft 浏覽器編寫代碼,就需要使用不同的代碼。事實上就是如下所示的簡單代碼:
<script language="Javascript" type="text/Javascript">
var xmlHttp = new XMLHttpRequest();
</script>
這行簡單得多的代碼在 Mozilla、Firefox、Safari、Opera 以及基本上所有以任何形式或方式支持 AJax 的非 Microsoft 浏覽器中,創建了 XMLHttpRequest 對象。
結合起來關鍵是要支持所有浏覽器。誰願意編寫一個只能用於 Internet Explorer 或者非 Microsoft 浏覽器的應用程序呢?或者更糟,要編寫一個應用程序兩次?當然不!因此代碼要同時支持 Internet Explorer 和非 Microsoft 浏覽器。如下顯示了這樣的代碼。
<script language="Javascript" type="text/Javascript">
var XMLHttp = false;
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
XMLHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
</script>
這段代碼的核心分為三步:
1,建立一個變量 xmlHttp 來引用即將創建的 XMLHttpRequest 對象。
2,嘗試在 Microsoft 浏覽器中創建該對象:
嘗試使用 Msxml2.XMLHTTP 對象創建它。
如果失敗,再嘗試 Microsoft.XMLHTTP 對象。
3,如果仍然沒有建立 XMLHttp,則以非 Microsoft 的方式創建該對象。
最後,xmlHttp 應該引用一個有效的 XMLHttpRequest 對象,無論運行什麼樣的浏覽器。