<h2 class="post-title">Start AJAX</h2><div class="post-body"><p>最近开始研究AJAX(Asynchronous Javascript and XML),很幸运google到了这篇发表在<a href="http://developer.mozilla.org/" target="_blank"><font color="#009999">Devmo</font></a>上的<a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started" target="_blank"><font color="#009999">AJAX: Getting Started</font></a>。现把这篇简洁易懂的文章翻译如下,与大家共享,希望能对大家有所帮助!</p><p>这篇文章会使你对AJAX有一个基本了解,并给出两个容易上手的例子。</p><h3>目录</h3><p></p><ol><li><a href="http://www.marchbox.com/blog/post/start_ajax.html#what-s-ajax" target="_blank"><font color="#009999">什么是AJAX?</font></a> </li><li><a href="http://www.marchbox.com/blog/post/start_ajax.html#http-request" target="_blank"><font color="#009999">第一步:如何发出一个HTTP请求</font></a> </li><li><a href="http://www.marchbox.com/blog/post/start_ajax.html#server-response" target="_blank"><font color="#009999">第二步:处理服务器的响应</font></a> </li><li><a href="http://www.marchbox.com/blog/post/start_ajax.html#simple-example" target="_blank"><font color="#009999">第三步:一个简单的例子</font></a> </li><li><a href="http://www.marchbox.com/blog/post/start_ajax.html#xml-response" target="_blank"><font color="#009999">第四步:与XML响应协同工作</font></a></li></ol><p><font color="#009999"></font></p><h3 id="what-s-ajax" name="what-s-ajax">什么是AJAX</h3><p>AJAX是一个新的合成术语,隐含了两个已经存在多年的Javascript特性,但是直到最近,随着一些诸如Gmail、Google Suggest以及Google Maps的轰动,才被许多网络开发者所注意到。</p><p>我们所讨论的两个Javascript的特性是你能够: </p><ul><li>向服务器发出请求而不需重新加载任何页面 </li><li>解析XML文档并且与之协同工作</li></ul><p></p><p>AJAX是一个缩写,<strong>A</strong>是指<em>"asynchronous"</em>(异步的),它表示你可以在向服务器发出一个HTTP请求后,边做其他的事情,边等待服务器的响应。<strong>JA</strong>表示<em>"Javascript"</em>,<strong>X</strong>表示<em>"XML"</em>(可扩展标记语言)。</p><h3 id="http-request" name="http-request">第一步:如何发出一个HTTP请求</h3><p>为了用Javascript向服务器发出一个HTTP请求,你需要一个类的实例来提供给你这种功能。这个类原本在IE里被作为一个ActiveX对象提出,叫<font color="#006699">XMLHTTP</font>。然后,Mozilla、Safari以及一些其他的浏览器相继跟随,出现了一个<font color="#006699">XMLHttpRequest</font>类,其支持微软的ActiveX对象原本的方法和属性。</p><p>所以,为了能够跨浏览器地创建这个类的对象,你需要这样:</p><font color="#006699">if (window.XMLHttpRequest) { // Mozilla, Safari,<br /> http_request = new XMLHttpRequest();<br />} else if (window.ActiveXObject) { // IE<br /> http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />}</font>(以上例子中的代码,是一个用来构建XMLHTTP实例的简单版本,实际使用时的例子请参见本文的第三步) <p></p><p>如果服务器端的响应中没有包含XML的mime-type报头(header),有些版本的Mozilla浏览器可能不会处理。所以,为了安全起见,你可以用一个特殊的方法来给服务器端发出的响应强加上这个报头,以防其不是<font color="#006699">text/xml</font>类型。</p><font color="#006699">http_request = new XMLHttpRequest();<br />http_request.overrideMimeType('text/xml');</font><p><font color="#006699"></font></p><p>下一步就是你来决定在服务器对你的请求作出响应后,你准备做什么。这一阶段,你只需要告诉HTTP请求对象(HTTP request object)用哪一个Javascript函数来处理这一响应。这一步用设置该对象<font color="#006699">onreadystatechange</font>属性为相应的Javascript函数名来实现:</p><font color="#006699">http_request.onreadystatechange = nameOfTheFunction;</font><p><font color="#006699"></font></p><p>注意,在函数名后面没有括号。另外如下定义处理响应的函数:</p><font color="#006699">http_request.onreadystatechange = function(){<br /> // 处理响应<br />};</font><p><font color="#006699"></font></p><p>接下来,既然你已经声明了在接到响应后干什么,你就需要去发出请求。你需要调用HTTP请求类的<font color="#006699">open()</font>和<font color="#006699">send()</font>方法:</p><font color="#006699">http_request.open('GET', 'http://www.example.org/some.file', true);<br />http_request.send(null);</font><ul><li><font color="#006699">open()</font>方法的第一个参数是HTTP请求的方式——GET、POST、HEAD或者任何其它你想使用的,你的服务器支持的方式。方式的名称要大写,否则有些浏览器(如Firefox)可能就不会处理请求。可以去 <a title="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"><font color="#009999">W3C specs</font></a>获取更多的你可以使用的HTTP请求方式的信息。 </li><li>第二个参数是你所请求页面的URL。 </li><li>第三个参数是用来设置请求是否为异步的。如果是<font color="#006699">TRUE</font>,则在服务器尚未返回响应的时候,Javascript的函数会继续执行。这也就是AJAX中的A的含义。</li></ul><p></p><p><font color="#006699">send()</font>方法的参数可以使任何你希望传递给服务器的数据,数据应该为如下格式的查询串:</p><font color="#006699">name=value&anothername=othervalue&so=on</font><p><font color="#006699"></font></p><h3 id="server-response" name="server-response">第二步:处理服务器响应</h3><p>记住,当你向服务器发出了一个请求,你也就发出了一个被设计用来处理响应的Javascript函数的名字。</p><p><font color="#006699">http_request.onreadystatechange = nameOfTheFunction;</font></p><p>我们来看看这个函数都应该做些什么。首先,其需要检查请求的状态,如果状态的值为4,那么就意味着全部的服务器响应都已接受完毕,你可以继续来处理了。</p><font color="#006699">if (http_request.readyState == 4) {<br /> // 一切就绪,相映已接受完成<br />} else {<br /> //尚未就绪<br />}</font><font color="#006699">readyState</font>全部值的列表如下: <ul><li>0(未初始化/uninitialized) </li><li>1(正在加载/loading) </li><li>2(加载完毕/loaded) </li><li>3(交互/interactive) </li><li>4(完成/complete)</li></ul>(<a title="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate 1.asp" href="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp"><font color="#009999">来源</font></a>) <p></p><p>下一步是检查HTTP服务器响应的情况代码。所有可能的代码都被列在了<a title="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"><font color="#009999">W3C的网站</font></a>上。目前,我们只对<font color="#006699">200 OK</font>响应感兴趣。</p><font color="#006699">if (http_request.status == 200) {<br /> // 棒极了!<br />} else {<br /> // 请求出了些问题,<br /> // 比如响应可能是404(Not Found),未找到<br /> // 或者500,内部服务器错误<br />}</font><p><font color="#006699"></font></p><p>在你检查完请求的状态和HTTP响应情况后,你就可以自己决定对服务器发送给你的数据作什么样的处理了。你有两种途径来访问这些数据: </p><ul><li><font color="#006699">http_request.responseText</font>将会把服务器的响应作为一个文本串返回 </li><li><font color="#006699">http_request.responseXML</font>将把响应作为一个<font color="#006699">XMLDocument</font>对象返回,你可以用Javascript的文档对象模型(DOM)的函数来处理</li></ul><p></p><h3 id="simple-example" name="simple-example">第三步:一个简单的例子</h3><p>我现在来做一个简单的HTTP请求。我们的Javascript脚本将会请求一个HTML文档,<font color="#006699">test.html</font>,其包含了一段文本——“这是一个测试。”——然后我们会<font color="#006699">about ) test.html</font>的内容。</p><font color="#006699"><script type="text/javascript" language="javascript"><br /> var http_request = false;<br /><br /> function makeRequest(url) {<br /><br /> http_request = false;<br /><br /> if (window.XMLHttpRequest) { // Mozilla, Safari,...<br /><br /> http_request = new XMLHttpRequest();<br /> if (http_request.overrideMimeType) {<br /> http_request.overrideMimeType('text/xml');<br /> }<br /> } else if (window.ActiveXObject) { // IE<br /> try {<br /> http_request = new ActiveXObject("Msxml2.XMLHTTP");<br /> } catch (e) {<br /> try {<br /> http_request = new ActiveXObject("Microsoft.XMLHTTP");<br /> } catch (e) {}<br /> }<br /> }<br /><br /> if (!http_request) {<br /> about 'Giving up Cannot create an XMLHTTP instance');<br /> return false;<br /> }<br /> http_request.onreadystatechange = about:Contents;<br /> http_request.open('GET', url, true);<br /> http_request.send(null);<br /><br /> }<br /><br /> function about:Contents() {<br /><br /> if (http_request.readyState == 4) {<br /> if (http_request.status == 200) {<br /> about:(http_request.responseText);<br /> } else {<br /> about:('There was a problem with the request.');<br /> }<br /> }<br /><br /> }<br /></script><br /><br /><span<br /> style="cursor: pointer; text-decoration: underline"<br /> onload="makeRequest('test.html')"><br /> 发出请求<br /></span></font><p>在这个例子中: </p><ul><li>用户在浏览器里点击“发出请求”(make a request); </li><li>这会调用<font color="#006699">makeRequest()</font>函数,并且附有参数<font color="#006699">test.html</font>,一个自阿同一目录下的HTML文档的名字。 </li><li>请求被发出,然后(<font color="#006699">onreadystatechange</font>)操作被传递给<font color="#006699">about:Contents()</font>; </li><li><font color="#006699">about:Contents()</font>检查响应是否被接收和是否状态为“OK”,然后<font color="#006699">about:() test.html</font>文件的内容。</li></ul><p></p><p>你可以在<a title="http://www.w3clubs.com/mozdev/httprequest test.html" href="http://www.w3clubs.com/mozdev/httprequest_test.html"><font color="#009999">这里</font></a>测试这个例子,并且可以在<a title="http://www.w3clubs.com/mozdev/test.html" href="http://www.w3clubs.com/mozdev/test.html"><font color="#009999">这里</font></a>看见测试文件。</p><h3 id="xml-response" name="xml-response">与XML响应协同工作</h3><p>在上个例子中,在HTTP响应被接收完毕后,我们和使用了请求对象的<font color="#006699">responseText</font>属性,其包含了<font color="#006699">test.html</font>文件的内容。现在,让我们试试<font color="#006699">responseXML</font>属性。</p><p>让我们现在就创建一个有效的XML文档,这个文档稍后会被我们请求。文档(test.xml)包括:</p><font color="#006699"><?xml version="1.0" encoding="utf-8" ?><br /><root><br /> 这是个测试.<br /></root></font>我们只需要在脚本中用下面的内容替换请求行:<font color="#006699">...<br />onload="makeRequest('test.xml)"><br />...</font>然后在<font color="#006699">about:Contents()</font>里把<font color="#006699">about:()</font>行替换成<font color="#006699">about:(http_request.responseText);</font>,并且,在其上方写下:<font color="#006699">var xmldoc = http_request.responseXML;<br />var root_node = xmldoc.getElementsByTagName('root').item(0);<br />about:(root_node.firstChild.data);</font><p><font color="#006699"></font></p><p>这样,我们获取了<font color="#006699">responseXML</font>中的<font color="#006699">XMLDocument</font>对象,并且用DOM方法来访问了XML文档中所包含的某些内容。你可以在<a title="http://www.w3clubs.com/mozdev/test.xml" href="http://www.w3clubs.com/mozdev/test.xml"><font color="#009999">这里</font></a>浏览到<font color="#006699">test.xml</font>,更新后的脚本可以在<a title="http://www.w3clubs.com/mozdev/httprequest test xml.html" href="http://www.w3clubs.com/mozdev/httprequest_test_xml.html"><font color="#009999">这里</font></a>得到。</p><p>可以去<a title="http://www.mozilla.org/docs/dom/" href="http://www.mozilla.org/docs/dom/"><font color="#009999">Mozilla's DOM implementation</font></a>获取更多的DOM方法。</p></div> |