﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-drh0r-文章分类-WEB开发</title><link>http://www.blogjava.net/drh0r/category/14418.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 20:24:56 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 20:24:56 GMT</pubDate><ttl>60</ttl><item><title>Ajax Getting Started</title><link>http://www.blogjava.net/drh0r/articles/65475.html</link><dc:creator>drh0r</dc:creator><author>drh0r</author><pubDate>Thu, 24 Aug 2006 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/drh0r/articles/65475.html</guid><wfw:comment>http://www.blogjava.net/drh0r/comments/65475.html</wfw:comment><comments>http://www.blogjava.net/drh0r/articles/65475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/drh0r/comments/commentRss/65475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/drh0r/services/trackbacks/65475.html</trackback:ping><description><![CDATA[
		<h2 class="post-title">
				<u>
						<font color="#0000ff">Getting Started</font>
				</u>
		</h2>
		<div class="post-body">
				<p>转载google这篇发表在<a href="http://developer.mozilla.org/">Devmo</a>上的<a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started">AJAX: Getting Started</a>。</p>
				<h3>目录</h3>
				<p>
				</p>
				<ol>
						<li>
								<a href="http://www.marchbox.com/blog/post/start_ajax.html#what-s-ajax">什么是AJAX？</a>
						</li>
						<li>
								<a href="http://www.marchbox.com/blog/post/start_ajax.html#http-request">第一步：如何发出一个HTTP请求</a>
						</li>
						<li>
								<a href="http://www.marchbox.com/blog/post/start_ajax.html#server-response">第二步：处理服务器的响应</a>
						</li>
						<li>
								<a href="http://www.marchbox.com/blog/post/start_ajax.html#simple-example">第三步：一个简单的例子</a>
						</li>
						<li>
								<a href="http://www.marchbox.com/blog/post/start_ajax.html#xml-response">第四步：与<acronym title="Extensible Markup Language">XML</acronym>响应协同工作</a>
						</li>
				</ol>
				<p>
				</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对象提出，叫<code>XMLHTTP</code>。然后，Mozilla、Safari以及一些其他的浏览器相继跟随，出现了一个<code>XMLHttpRequest</code>类，其支持微软的ActiveX对象原本的方法和属性。</p>
				<p>所以，为了能够跨浏览器地创建这个类的对象，你需要这样：</p>
				<pre>
						<code>if (window.XMLHttpRequest) { // Mozilla, Safari,<br />    http_request = new XMLHttpRequest();<br />} else if (window.ActiveXObject) { // IE<br />    http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />}</code>
				</pre>（以上例子中的代码，是一个用来构建XMLHTTP实例的简单版本，实际使用时的例子请参见本文的第三步） 
<p></p><p>如果服务器端的响应中没有包含XML的mime-type报头（header），有些版本的Mozilla浏览器可能不会处理。所以，为了安全起见，你可以用一个特殊的方法来给服务器端发出的响应强加上这个报头，以防其不是<code>text/xml</code>类型。</p><pre><code>http_request = new XMLHttpRequest();<br />http_request.overrideMimeType('text/xml');</code></pre><p></p><p>下一步就是你来决定在服务器对你的请求作出响应后，你准备做什么。这一阶段，你只需要告诉HTTP请求对象（HTTP request object）用哪一个JavaScript函数来处理这一响应。这一步用设置该对象<code>onreadystatechange</code>属性为相应的JavaScript函数名来实现：</p><pre><code>http_request.onreadystatechange = nameOfTheFunction;</code></pre><p></p><p>注意，在函数名后面没有括号。另外如下定义处理响应的函数：</p><pre><code>http_request.onreadystatechange = function(){<br />    // 处理响应<br />};</code></pre><p></p><p>接下来，既然你已经声明了在接到响应后干什么，你就需要去发出请求。你需要调用HTTP请求类的<code>open()</code>和<code>send()</code>方法：</p><pre><code>http_request.open('GET', 'http://www.example.org/some.file', true);<br />http_request.send(null);</code></pre><ul><li><code>open()</code>方法的第一个参数是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">W3C specs</a>获取更多的你可以使用的HTTP请求方式的信息。 
</li><li>第二个参数是你所请求页面的URL。 
</li><li>第三个参数是用来设置请求是否为异步的。如果是<code>TRUE</code>，则在服务器尚未返回响应的时候，JavaScript的函数会继续执行。这也就是AJAX中的A的含义。</li></ul><p></p><p><code>send()</code>方法的参数可以使任何你希望传递给服务器的数据，数据应该为如下格式的查询串：</p><pre><code>name=value&amp;anothername=othervalue&amp;so=on</code></pre><p></p><h3 id="server-response" name="server-response">第二步：处理服务器响应</h3><p>记住，当你向服务器发出了一个请求，你也就发出了一个被设计用来处理响应的JavaScript函数的名字。</p><p><code>http_request.onreadystatechange = nameOfTheFunction;</code></p><p>我们来看看这个函数都应该做些什么。首先，其需要检查请求的状态，如果状态的值为4，那么就意味着全部的服务器响应都已接受完毕，你可以继续来处理了。</p><pre><code>if (http_request.readyState == 4) {<br />    // 一切就绪，相映已接受完成<br />} else {<br />    //尚未就绪<br />}</code></pre><code>readyState</code>全部值的列表如下： 
<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">来源</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">W3C的网站</a>上。目前，我们只对<code>200 OK</code>响应感兴趣。</p><pre><code>if (http_request.status == 200) {<br />    // 棒极了！<br />} else {<br />    // 请求出了些问题，<br />    // 比如响应可能是404(Not Found)，未找到<br />    // 或者500，内部服务器错误<br />}</code></pre><p></p><p>在你检查完请求的状态和HTTP响应情况后，你就可以自己决定对服务器发送给你的数据作什么样的处理了。你有两种途径来访问这些数据： </p><ul><li><code>http_request.responseText</code>将会把服务器的响应作为一个文本串返回 
</li><li><code>http_request.responseXML</code>将把响应作为一个<code>XMLDocument</code>对象返回，你可以用JavaScript的文档对象模型（DOM）的函数来处理</li></ul><p></p><h3 id="simple-example" name="simple-example">第三步：一个简单的例子</h3><p>我现在来做一个简单的HTTP请求。我们的JavaScript脚本将会请求一个HTML文档，<code>test.html</code>，其包含了一段文本——“这是一个测试。”——然后我们会<code>alert() test.html</code>的内容。</p><pre><code>&lt;script type="text/javascript" language="javascript"&gt;<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 />            alert('Giving up :( Cannot create an XMLHTTP instance');<br />            return false;<br />        }<br />        http_request.onreadystatechange = alertContents;<br />        http_request.open('GET', url, true);<br />        http_request.send(null);<br /><br />    }<br /><br />    function alertContents() {<br /><br />        if (http_request.readyState == 4) {<br />            if (http_request.status == 200) {<br />                alert(http_request.responseText);<br />            } else {<br />                alert('There was a problem with the request.');<br />            }<br />        }<br /><br />    }<br />&lt;/script&gt;<br /><br />&lt;span<br />    style="cursor: pointer; text-decoration: underline"<br />    onclick="makeRequest('test.html')"&gt;<br />        发出请求<br />&lt;/span&gt;</code></pre><p>在这个例子中： </p><ul><li>用户在浏览器里点击“发出请求”（make a request）； 
</li><li>这会调用<code>makeRequest()</code>函数，并且附有参数<code>test.html</code>，一个自阿同一目录下的HTML文档的名字。 
</li><li>请求被发出，然后（<code>onreadystatechange</code>）操作被传递给<code>alertContents()</code>； 
</li><li><code>alertContents()</code>检查响应是否被接收和是否状态为“OK”，然后<code>alert() test.html</code>文件的内容。</li></ul><p></p><p>你可以在<a title="http://www.w3clubs.com/mozdev/httprequest test.html" href="http://www.w3clubs.com/mozdev/httprequest_test.html">这里</a>测试这个例子，并且可以在<a title="http://www.w3clubs.com/mozdev/test.html" href="http://www.w3clubs.com/mozdev/test.html">这里</a>看见测试文件。</p><h3 id="xml-response" name="xml-response">与XML响应协同工作</h3><p>在上个例子中，在HTTP响应被接收完毕后，我们和使用了请求对象的<code>responseText</code>属性，其包含了<code>test.html</code>文件的内容。现在，让我们试试<code>responseXML</code>属性。</p><p>让我们现在就创建一个有效的XML文档，这个文档稍后会被我们请求。文档（test.xml）包括：</p><pre><code>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;root&gt;<br />    这是个测试.<br />&lt;/root&gt;</code></pre>我们只需要在脚本中用下面的内容替换请求行：<pre><code>...<br />onclick="makeRequest('test.xml)"&gt;<br />...</code></pre>然后在<code>alertContents()</code>里把<code>alert()</code>行替换成<code>alert(http_request.responseText);</code>，并且，在其上方写下：<pre><code>var xmldoc = http_request.responseXML;<br />var root_node = xmldoc.getElementsByTagName('root').item(0);<br />alert(root_node.firstChild.data);</code></pre><p></p><p>这样，我们获取了<code>responseXML</code>中的<code>XMLDocument</code>对象，并且用DOM方法来访问了XML文档中所包含的某些内容。你可以在<a title="http://www.w3clubs.com/mozdev/test.xml" href="http://www.w3clubs.com/mozdev/test.xml">这里</a>浏览到<code>test.xml</code>，更新后的脚本可以在<a title="http://www.w3clubs.com/mozdev/httprequest test xml.html" href="http://www.w3clubs.com/mozdev/httprequest_test_xml.html">这里</a>得到。</p><p>可以去<a title="http://www.mozilla.org/docs/dom/" href="http://www.mozilla.org/docs/dom/">Mozilla's DOM implementation</a>获取更多的DOM方法。</p></div>
<img src ="http://www.blogjava.net/drh0r/aggbug/65475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/drh0r/" target="_blank">drh0r</a> 2006-08-24 11:37 <a href="http://www.blogjava.net/drh0r/articles/65475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>