# The XMLHttpRequest 对象
通过 XMLHttpRequest 对象,您可以在不重新加载整个页面的情况下更新网页中的某个部分。
## XMLHttpRequest 对象
XMLHttpRequest 对象用于幕后与服务器交换数据。
XMLHttpRequest 对象是**开发者的梦想**,因为您可以:
* 在不重新加载页面的情况下更新网页
* 在页面已加载后从服务器请求数据
* 在页面已加载后从服务器接收数据
* 在后台向服务器发送数据
## 创建 XMLHttpRequest 对象
所有现代的浏览器(IE7+、Firefox、Chrome、Safari 和 Opera)都有一个内建的 XMLHttpRequest 对象。
创建 XMLHttpRequest 对象的语法
```
xmlhttp=new XMLHttpRequest();
```
旧版本的 Internet Explorer(IE5 和 IE6)使用 ActiveX 对象:
```
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
```
为了处理所有现代的浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建一个 XMLHttpRequest 对象,如果不支持,则创建一个 ActiveX 对象:
## 实例
```
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
```
## 发送一个请求到服务器
为了发送一个请求到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
```
xmlhttp.open("GET","xmlhttp_info.txt",true);
xmlhttp.send();
```
| 方法 | 描述 |
| :-- | :-- |
| open(_method,url,async_) | 规定请求的类型,URL,请求是否应该进行异步处理。
_method_:请求的类型:GET 或 POST
_url_:文件在服务器上的位置
_async_:true(异步)或 false(同步) |
| send(_string_) | 发送请求到服务器。
_string_:仅用于 POST 请求 |
## GET 或 POST?
GET 比 POST 简单并且快速,可用于大多数情况下。
然而,下面的情况下请始终使用 POST 请求:
* 缓存的文件不是一个选项(更新服务器上的文件或数据库)
* 发送到服务器的数据量较大(POST 没有大小的限制)
* 发送用户输入(可以包含未知字符),POST 比 GET 更强大更安全
## URL - 服务器上的文件
open() 方法的 url 参数,是一个在服务器上的文件的地址:
```
xmlhttp.open("GET","xmlhttp_info.txt",true);
```
该文件可以是任何类型的文件(如 .txt 和 .xml),或服务器脚本文件(如.html 和 .php,可在发送回响应之前在服务器上执行动作)。
## 异步 - True 或 False?
如需异步发送请求,open() 方法的 async 参数必需设置为 true:
```
xmlhttp.open("GET","xmlhttp_info.txt",true);
```
发送异步请求对于 Web 开发人员是一个巨大的进步。在服务器上执行的许多任务非常费时。
通过异步发送,JavaScript 不需要等待服务器的响应,但可以替换为:
* 等待服务器的响应时,执行其他脚本
* 响应准备时处理响应
## Async=true
当使用 async=true 时,在 onreadystatechange 事件中响应准备时规定一个要执行的函数:
## 实例
```
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","xmlhttp_info.txt",true);
xmlhttp.send();
```
## Async=false
如需使用 async=false,请更改 open() 方法的第三个参数为 false:
```
xmlhttp.open("GET","xmlhttp_info.txt",false);
```
不推荐使用 async=false,但如果处理几个小的请求还是可以的。
请记住,JavaScript 在服务器响应准备之前不会继续执行。如果服务器正忙或缓慢,应用程序将挂起或停止。
**注意:**当您使用 async=false 时,不要编写 onreadystatechange 函数 - 只需要把代码放置在 send() 语句之后即可:
## 实例
```
xmlhttp.open("GET","xmlhttp_info.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
```
## 服务器响应
如需从服务器获取响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
| 属性 | 描述 |
| :-- | :-- |
| responseText | 获取响应数据作为字符串 |
| responseXML | 获取响应数据作为 XML 数据 |
## responseText 属性
如果来自服务器的响应不是 XML,请使用 responseText 属性。
responseText 属性以字符串形式返回响应,您可以相应地使用它:
## 实例
```
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
```
## responseXML 属性
如果来自服务器的响应不是 XML,且您想要把它解析为 XML 对象,请使用 responseXML 属性:
## 实例
请求文件 [cd_catalog.xml](images/cd_catalog.xml) 并解析响应:
```
xmlDoc=xmlhttp.responseXML;
var txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{
txt=txt + x[i].childNodes[0].nodeValue + "
";
}
document.getElementById("myDiv").innerHTML=txt;
```
## onreadystatechange 事件
当请求被发送到服务器,我们要根据响应执行某些动作。
onreadystatechange 事件在每次 readyState 变化时被触发。
readyState 属性持有 XMLHttpRequest 的状态。
XMLHttpRequest 对象的三个重要的属性:
| 属性 | 描述 |
| :-- | :-- |
| onreadystatechange | 存储函数(或函数的名称)在每次 readyState 属性变化时被自动调用 |
| readyState | 存放了 XMLHttpRequest 的状态。从 0 到 4 变化:
0:请求未初始化
1:服务器建立连接
2:收到的请求
3:处理请求
4:请求完成和响应准备就绪 |
| status | 200:"OK"
404:找不到页面 |
在 onreadystatechange 事件中,我们规定当服务器的响应准备处理时会发生什么。
当 readyState 是 4 或状态是 200 时,响应准备:
## 实例
```
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
```
**注意:**onreadystatechange 事件在每次 readyState 发生变化时被触发,总共触发了四次。
## 更多实例
[通过 getAllResponseHeaders() 检索头信息](/try/try.php?filename=try_dom_xmlhttprequest_header)
检索资源(文件)的头信息。
[通过 getResponseHeader() 检索指定头信息](/try/try.php?filename=try_dom_xmlhttprequest_lastmodified)
检索资源(文件)的指定头信息。
[检索 ASP 文件的内容](/try/try.php?filename=try_dom_xmlhttprequest_suggest)
当用户在输入字段键入字符时,网页如何与 Web 服务器进行通信。
[从数据库中检索内容](/try/try.php?filename=try_dom_xmlhttprequest_database)
网页如何通过 XMLHttpRequest 对象从数据库中提取信息。
[检索 XML 文件的内容](/try/try.php?filename=try_dom_xmlhttprequest_xml)
创建一个 XMLHttpRequest 从 XML 文件中检索数据并把数据显示在一个 HTML 表格中。
- XML 基础
- XML 简介
- XML 用途
- XML 树结构
- XML 语法规则
- XML 元素
- XML 属性
- XML 验证
- 查看 XML 文件
- 使用 CSS 显示 XML
- 使用 XSLT 显示 XML
- XML Javascript
- XMLHttpRequest 对象
- XML Parser
- XML DOM
- XML to HTML
- XML 应用程序
- XML 进阶
- XML 命名空间
- XML CDATA
- XML 编码
- 服务器上的 XML
- XML DOM 高级
- XML 注意事项
- XML 相关技术
- 现实生活中的 XML
- XML 编辑器
- XML - E4X
- DTD 教程
- DTD 简介
- DTD - XML 构建模块
- DTD - 元素
- DTD - 属性
- XML 元素 vs. 属性
- DTD - 实体
- DTD 验证
- DTD - 来自网络的实例
- XML DOM
- XML DOM 简介
- XML DOM 节点
- XML DOM 节点树
- XML DOM 解析器
- XML DOM 加载函数
- XML DOM - 属性和方法
- XML DOM - 访问节点
- XML DOM 节点信息
- XML DOM 节点列表
- XML DOM 遍历节点树
- XML DOM 浏览器差异
- XML DOM - 导航节点
- XML DOM 获取节点值
- XML DOM 改变节点值
- XML DOM 删除节点
- XML DOM 替换节点
- XML DOM 创建节点
- XML DOM 添加节点
- XML DOM 克隆节点
- The XMLHttpRequest 对象
- XML DOM 节点类型
- XML DOM - Node 对象
- XML DOM - NodeList 对象
- XML DOM - NamedNodeMap 对象
- XML DOM - Document 对象
- XML DOM - DocumentImplementation 对象
- XML DOM - DocumentType 对象
- XML DOM - ProcessingInstruction 对象
- XML DOM - Element 对象
- XML DOM - Attr 对象
- XML DOM - Text 对象
- XML DOM - CDATASection 对象
- XML DOM - Comment 对象
- XMLHttpRequest 对象
- XML DOM Parse Error 对象
- XML DOM 解析器错误
- XSLT 教程
- XSL 语言
- XSLT 简介
- XSLT 浏览器
- XSLT - 转换
- XSLT <xsl:template> 元素
- XSLT <xsl:value-of> 元素
- XSLT <xsl:for-each> 元素
- XSLT <xsl:sort> 元素
- XSLT <xsl:if> 元素
- XSLT <xsl:choose> 元素
- XSLT <xsl:apply-templates> 元素
- XSLT - 在客户端
- XSLT - 在服务器端
- XSLT - 编辑 XML
- XML 编辑器
- XSLT 元素参考手册
- XSLT 函数
- XPath 教程
- XPath 简介
- XPath 节点
- XPath 语法
- XPath 轴(Axes)
- XPath 运算符
- XPath Examples
- XPath、XQuery 以及 XSLT 函数函数参考手册
- 函数参考手册
- XQuery 教程
- XQuery 简介
- XQuery 实例
- XQuery FLWOR 表达式
- XQuery FLWOR + HTML
- XQuery 术语
- XQuery 语法
- XQuery 添加元素 和属性
- XQuery 选择 和 过滤
- XQuery 函数
- XQuery 参考手册
- XLink 和 XPointer 教程
- XLink 和 XPointer 简介
- XLink 和 XPointer 语法
- XLink 实例
- XPointer 实例
- XLink 参考手册
- XML Schema 教程
- XML Schema 简介
- 为什么使用 XML Schemas?
- XSD 如何使用?
- XSD - <schema> 元素
- XSD 简易元素
- XSD 属性
- XSD 限定 / Facets
- XSD 复合元素
- XSD 空元素
- XSD 仅含元素
- XSD 仅含文本
- XSD 混合内容
- XSD 指示器
- XSD <any> 元素
- XSD <anyAttribute> 元素
- XSD 元素替换(Element Substitution)
- XSD 实例
- XSD 字符串 数据类型
- XSD 日期和时间数据类型
- XSD 数值数据类型
- XSD 杂项 数据类型
- XML 编辑器
- XML Schema 参考手册
- XSD 元素
- XSD 限定/Facets
- SOAP 教程
- SOAP 简介
- SOAP 语法
- SOAP Envelope 元素
- SOAP Header 元素
- SOAP Body 元素
- SOAP Fault 元素
- SOAP HTTP 协议
- SOAP 实例
- WSDL 教程
- WSDL 简介
- WSDL 文档
- WSDL 端口
- WSDL 绑定
- WSDL UDDI
- RSS 教程
- RSS 简介
- RSS 历史
- RSS 语法
- RSS <channel> 元素
- RSS <item> 元素
- RSS 发布您的 Feed
- RSS 阅读器
- RSS 参考手册
- RDF 教程
- RDF 简介
- RDF 规则
- RDF 实例
- RDF 主要 元素
- RDF 容器 Elements
- RDF 集合
- RDF Schema (RDFS)
- RDF 都柏林核心元数据倡议
- OWL 简介
- RDF 参考手册
- XSL-FO 教程
- XSL-FO 简介
- XSL-FO 文档
- XSL-FO 区域
- XSL-FO 输出
- XSL-FO 流
- XSL-FO 页面
- XSL-FO 块
- XSL-FO 列表
- XSL-FO 表格
- XSL-FO 与 XSLT
- XSL-FO 软件
- XSL-FO 参考手册
- SVG 教程
- SVG 简介
- SVG 实例
- SVG 在 HTML 页面
- SVG <rect>
- SVG <circle>
- SVG <ellipse>
- SVG <line>
- SVG <polygon>
- SVG <polyline>
- SVG <path>
- SVG <text>
- SVG Stroke 属性
- SVG 滤镜
- SVG 模糊效果
- SVG 阴影
- SVG 渐变 - 线性
- SVG 渐变- 放射性
- SVG 参考手册
- 免责声明