最新的Web開發教程
 

XMLHttpRequest對象


所有現代瀏覽器有一個內置的XMLHttpRequest對象從服務器請求數據。

所有主要的瀏覽器都有一個內置的XML解析器來訪問和操作XML。


XMLHttpRequest對象

XMLHttpRequest對象可用於從Web服務器請求數據。

XMLHttpRequest對象是a developers dream ,因為你可以:

  • 更新網頁無需重新加載頁面
  • 從服務器請求數據 - 在頁面加載後,
  • 從服務器接收數據 - 在頁面加載後,
  • 將數據發送到服務器 - 在後台

XMLHttpRequest的實例

當鍵入在下面的輸入字段的字符,一個XMLHttpRequest被發送到服務器,以及一些名稱建議返回(from the server)

Start typing a name in the input field below:

Name:

Suggestions:


發送一個XMLHttpRequest

所有現代瀏覽器有一個內置的XMLHttpRequest對象。

使用它的一個共同JavaScript語法看起來像這樣:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
       // Action to be performed when the document is read;
    }
};
xhttp.open("GET", " filename ", true);
xhttp.send();
試一試»

創建XMLHttpRequest對象

在上面的例子中的第一行創建一個XMLHttpRequest OBJET:

var xhttp = new XMLHttpRequest();

onreadystatechange事件

readyState屬性持有了XMLHttpRequest的狀態。

onreadystatechange事件被觸發每次readyState的變化。

在一台服務器的請求,readyState的從0到4的變化:

0:請求未初始化
1:服務器連接建立
2:接收到的請求
3:請求處理
4:請求完成和響應準備就緒

在onreadystatechange屬性,指定一個函數來執行當readyState變化:

xhttp.onreadystatechange = function()

當readyState為4和狀態為200,則響應已準備就緒:

if (xhttp.readyState == 4 && xhttp.status == 200)

XMLHttpRequest的屬性和方法

方法 描述
new XMLHttpRequest() 創建一個新的XMLHttpRequest對象
open( method, url, async ) 指定請求的類型
method :請求的類型:GET或POST
url :文件位置
async :真(asynchronous)或false (synchronous)
send() 發送一個請求給服務器(used for GET)
send( string ) 發送一個請求字符串到服務器(used for POST)
onreadystatechange 被調用的函數當readyState屬性改變
readyState 了XMLHttpRequest的狀態
0:請求未初始化
1:服務器連接建立
2:接收到的請求
3:請求處理
4:請求完成和響應準備就緒
status 200:OK
404:找不到頁面
responseText 響應數據作為串
responseXML 響應數據為XML數據

跨域訪問

出於安全原因,現代的瀏覽器不允許跨域訪問。

這意味著這兩個網頁並嘗試加載XML文件,必須位於同一服務器上。

在w3ii的示例位於w3ii域中的所有Open XML文件。

如果你想用上面的例子在自己的網頁之一,您加載XML文件必須位於你自己的服務器上。


responseText屬性

responseText屬性返回響應作為一個字符串。

如果您想使用響應為文本字符串,請使用responseText屬性:

document.getElementById("demo").innerHTML = xmlhttp.responseText;
試一試»

responseXML屬性

responseXML屬性返回響應作為XML DOM對象。

如果您想使用響應作為XML DOM對象,請使用responseXML屬性:

請求文件cd_catalog.xml和使用響應作為XML DOM對象:

xmlDoc = xmlhttp.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("ARTIST");
for (i = 0; i < x.length; i++) {
    txt += x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
試一試»

GET或POST?

GET是簡單和較POST更快,並能在大多數情況下被使用。

然而,始終使用POST請求時:

  • 緩存的文件不是一個選項(update a file or database on the server)
  • 發送大量的數據到服務器(POST沒有大小限制)
  • 發送用戶輸入(which can contain unknown characters) ,POST是更強大和安全比GET

網址 - 上的文件服務器

該的URL參數open()方法,是一個地址到服務器上的文件:

xmlhttp.open("GET", "xmlhttp_info.txt", true);

該文件可以是任何類型的文件,如.txt和.xml或類似的.asp和.PHP(可發送回響應之前在服務器上執行的操作)服務器的腳本文件。


異步 - 真或假?

要異步發送請求,的async參數open()方法,已被設置為true:

xmlhttp.open("GET", "xmlhttp_info.txt", true);

發送異步請求是Web開發人員一個巨大的進步。 許多的服務器上執行的任務是非常耗時。

通過異步發送,JavaScript的不必等待服務器的響應,而是可以:

  • 執行其他腳本在等待服務器響應
  • 處理時的響應的響應是就緒

異步=真

當使用異步=真實,指定一個功能,當響應是onreadystatechange事件準備執行:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
       document.getElementById("demo").innerHTML = xmlhttp.responseText;
    }
};
xmlhttp.open("GET", "xmlhttp_info.txt", true);
xmlhttp.send();
試一試»

異步= FALSE

要使用異步=假,更改第三個參數open()方法為false:

xmlhttp.open("GET", "xmlhttp_info.txt", false);

使用異步=虛假不建議,但對於一些小的請求,這可能是好的。

請記住,JavaScript就無法繼續執行,直到服務器響應準備。 如果服務器太忙或太慢,應用程序將掛起或停止。

Note:當您使用異步=虛假的,不寫一個函數的onreadystatechange -只要把代碼後send()語句:

xmlhttp.open("GET", "xmlhttp_info.txt", false);
xmlhttp.send();
document.getElementById("demo").innerHTML = xmlhttp.responseText;
試一試»

XML解析器

所有現代瀏覽器有一個內置的XML解析器。

XML文檔對象模型(the XML DOM)含有大量的方法來訪問和編輯XML。

然而,可被訪問的XML文檔之前,它必須被加載到一個XML DOM對象。

XML解析器可以讀取明文,並轉換成一個XML DOM對象。


解析文本字符串

這個例子解析文本字符串轉換為XML DOM對象,並提取從中用JavaScript的信息:

<html>
<body>

<p id="demo"></p>

<script>
var text, parser, xmlDoc;

text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";

parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");

document.getElementById("demo").innerHTML =
xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
</script>

</body>
</html>
試一試»

舊的瀏覽器(IE5 and IE6)

Internet Explorer中的舊版本(IE5 and IE6)不支持XMLHttpRequest對象。

為了處理IE5和IE6,檢查瀏覽器是否支持XMLHttpRequest對象,否則創建的ActiveXObject:

if (window.XMLHttpRequest) {
    // code for modern browsers
    xmlhttp = new XMLHttpRequest();
 } else {
    // code for old IE browsers
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
試一試»

Internet Explorer中的舊版本(IE5 and IE6)不支持的DOMParser對象。

為了處理IE5和IE6,檢查瀏覽器支持的DOMParser對象,否則創建的ActiveXObject:

if (window.DOMParser) {
  // code for modern browsers
  parser = new DOMParser();
  xmlDoc = parser.parseFromString(text,"text/xml");
} else {
  // code for old IE browsers
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async = false;
  xmlDoc.loadXML(text);
試一試»

例子

更多示例

檢索與報頭信息getAllResponseHeaders()
檢索資源的頭信息(file)

檢索特定的頭信息與getResponseHeader()
檢索資源的特定頭信息(file)

檢索一個ASP文件的內容
如何網頁可以同時輸入字段的用戶類型字符的Web服務器通信。

從數據庫中檢索內容
如何網頁可以從XMLHttpRequest對象的數據庫獲取信息。

檢索XML文件的內容
創建一個XMLHttpRequest來檢索XML文件中的數據,並在一個HTML表格中顯示的數據。