最新的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表格中显示的数据。