XMLHttpRequest

XMLHttpRequest (XHR) 是一个 JavaScript类，包含将HTTP请求从网络浏览器异步传输到网络服务器的方法。这些方法允许基于浏览器的应用程序进行细粒度的服务器调用并把存储结果存储在XMLHttpRequest的codice_1特性中。 "XMLHttpRequest"类是Ajax编程的一个组件。在Ajax出现之前，需要将网页表单完全发送到服务器，然后刷新整个浏览器页面。
历史.
“XMLHttpRequest”类背后的概念是由Microsoft Outlook 的开发人员于2000年提出的——可在Windows 2000操作系统上使用。然后这个概念在Internet Explorer 5 (2001) 浏览器的 解释器 中实现。但是，原始的语法没有使用codice_2标识符。相反，开发人员使用了标识符codice_3和codice_4。 到Internet Explorer 7 (2006)，所有的浏览器都支持codice_2标识符。
codice_2标识符现在是所有现代浏览器的事实标准，包括Mozilla的Gecko layout engine (2002), Konqueror (2002), Safari 1.2 (2004), Opera 8.0 (2005), and iCab (2005).
随着跨浏览器 JavaScript 库（例如 jQuery）的出现，开发人员可以间接调用 XMLHttpRequest 功能。
标准.
万维网联盟 (W3C)于2006年4月5日发布了XMLHttpRequest对象的工作草案规范。 2008年2月25日，W3C发布了Working Draft Level 2规范。Level 2规范添加了监视事件进度、允许跨站点请求和处理字节流的方法。2011年底，Level 2规范被吸收到原始规范中。
2012年底，WHATWG接管开发并使用Web IDL维护动态文档。
XMLHttpRequest用法.
构造器.
生成发给Web服务器的异步请求首先要实例化分配内存）“XMLHttpRequest”对象。分配的内存（的地址）被赋值给变量。 JavaScript中实例化新对象的编程 语句 为codice_7。codice_7语句后跟对象的构造函数。面向对象语言的开发人员的习惯是使用与类名相同的名称来调用构造函数本例中，类名是"XMLHttpRequest"。实例化一个新的"XMLHttpRequest"并赋值给变量codice_9:
codice_10
open方法.
open方法准备"XMLHttpRequest"。它最多可接受五个参数，但只有前两个是必须的。
codice_10
codice_12
setRequestHeader方法.
如果调用codice_14请求方法，则需要额外发送媒体类型codice_20。codice_21方法允许程序将此或其他HTTP标头发送到Web服务器。其用法是codice_22。启用codice_14请求方法:
codice_24
send方法.
如果调用codice_14请求方法，则Web服务器期望从标准输入流读取表单数据。要将表单数据发送到Web服务器，请执行codice_26，其中FormData是文本字符串。如果调用codice_13请求方法，则Web服务器只需要默认标头。要发送默认标头，请执行codice_28. 
onreadystatechange事件监听器.
codice_29是一个回调方法，在整个Ajax生命周期中定期执行。要设置名为 codice_30的回调方法，语法为codice_31。为了方便起见，该语法允许定义匿名方法。定义匿名回调方法:
var request = new XMLHttpRequest();
request.onreadystatechange = function()
// code omitted
"XMLHttpRequest"生命周期经历几个阶段 - 从0到4。阶段0是调用codice_32方法之前，阶段4是文本字符串到达时。为了监视生命周期，"XMLHttpRequest"具有可用的codice_33属性。 第1-3阶段不明确，不同浏览器的解释也不同。尽管如此，一种解释是：
当codice_33达到4时，文本字符串已经到达并被设置在codice_1属性中。
var request = new XMLHttpRequest();
request.onreadystatechange = function()
 if ( request.readyState == 4 )
 // request.responseText is set
例子.
下例首先创建Javascript函数:
function ajax_submit( element_id, submit_url )
 var request = new XMLHttpRequest();
 var completed_state = 4;
 request.onreadystatechange = function()
 if ( request.readyState == completed_state )
 document.
 getElementById( element_id ).
 innerHTML =
 request.responseText;
 request.open( "DELETE", null );
 request.open( "GET", submit_url );
 request.send( null );
&lt;?php
 echo '&lt;h1&gt;Hello World!&lt;/h1&gt;';
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Hello World&lt;/title&gt;
 &lt;script type=text/javascript src=ajax_submit.js&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div id=ajax_title&gt;&lt;/div&gt;
 &lt;button onclick="ajax_submit( 'ajax_title', 'ajax.phtml' )"&gt;
 Submit
 &lt;/button&gt;
&lt;/body&gt;
CGI例子.
通用网关接口 (CGI) 进程允许浏览器请求Web服务器执行已编译的计算机程序。
CGI "XMLHttpRequest"的服务器组件是位于服务器上的可执行文件。操作系统将打开该文件并读取其机器指令。 "XMLHttpRequest"协议要求可执行文件输出文本字符串。
编译后的程序有两个文件：源代码和相应的可执行文件。
void main( void )
 /* CGI requires the first line to output: */
 printf( "Content-type: text/html\n" );
 /* CGI requires the second line to output: */
 printf( "\n" );
 printf( "&lt;h1&gt;Hello World!&lt;/h1&gt;\n" );
codice_44
或
codice_45
CGI浏览器组件与PHP浏览器组件相同，只是codice_46略有变化。 告诉Web服务器执行可执行文件的语法是codice_47后跟文件名。为了安全起见，可执行文件必须驻留在chroot 监狱中。在本例中，监狱是目录codice_48.
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Hello World&lt;/title&gt;
 &lt;script type=text/javascript src=ajax_submit.js&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div id=ajax_title&gt;&lt;/div&gt;
 &lt;button onclick="ajax_submit( 'ajax_title', '/cgi-bin/ajax' )"&gt;
 Submit
 &lt;/button&gt;
&lt;/body&gt;
外部链接.