﻿<?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>PHP博客-Programming Life-随笔分类-Ajax</title><link>http://www.phpweblog.net/killjin/category/382.html</link><description>相信不能相信的，完成不能完成的。矛盾，就象征进步。</description><language>zh-cn</language><lastBuildDate>Thu, 22 Nov 2007 02:20:16 GMT</lastBuildDate><pubDate>Thu, 22 Nov 2007 02:20:16 GMT</pubDate><ttl>60</ttl><item><title>Ajax 同一页面同时执行多个 XMLHTTP</title><link>http://www.phpweblog.net/killjin/archive/2007/11/22/2367.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 21 Nov 2007 22:10:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/11/22/2367.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2367.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/11/22/2367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2367.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2367.html</trackback:ping><description><![CDATA[<p>Ajax 同一页面如何同时执行多个 XMLHTTP 呢，比如博客页，需要同时利用 Ajax 读取作者信息、文章信息、评论信息&#8230;&#8230;</p>
<p>我们的第一反应可能是创建多个全局 XMLHTTP 对象，但这并不现实。其实实现方式非常简单，就是给 onreadystatechange 对应的回调函数加上参数，以下代码是解决方案中一个函数中的一段代码。</p>
<div class=code>xmlhttp.open("GET", "ajax_process.aspx?a=" + a, true);<br><span class=emphasis>xmlhttp.onreadystatechange = function () { OnReadyStateChng(xmlhttp, a); };</span><br>xmlhttp.send(null);</div>
<p>只是改写 onreadystatechange&nbsp;的属性值，这样就可以为 OnReadyStateChng 函数赋参数了。如是我们写作 xmlhttp.onreadystatechange = OnReadyStateChng;，那么 OnReadyStateChng 就不能有参数了，也就无法获得是哪个 xmlhttp 的响应，也就无法获得是响应后要对哪个控件进行设置。</p>
<p>我们可以看一个完整的示例，前台页面是普通的 Ajax 技术的 HTML 页面，后台使用的是 <a href="http://www.cftea.com/docs/" target=_blank>ASP.NET</a> 的 .aspx 文件，之所以采用 ASP.NET，是为了演示延时处理功能。</p>
<p><span class=itemTitle>前台程序</span></p>
<div class=code>&lt;?xml version="1.0" encoding="gb2312"?&gt;<br>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;</div>
<div class=code>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;<br>&lt;title&gt;Ajax Test&lt;/title&gt;<br>&lt;/head&gt;</div>
<div class=code>&lt;body&gt;</div>
<div class=code>&lt;div id="a1"&gt;1&lt;/div&gt;<br>&lt;div id="a2"&gt;2&lt;/div&gt;<br>&lt;div id="a3"&gt;3&lt;/div&gt;</div>
<div class=code>&lt;script type="text/javascript" language="javascript"&gt;<br>&lt;!--<br>function CreateHTTPObject()<br>{<br>&nbsp;&nbsp;&nbsp; var xmlhttp;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if (!xmlhttp &amp;&amp; typeof XMLHttpRequest!='undefined')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp = new XMLHttpRequest();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if (!xmlhttp &amp;&amp; window.createRequest)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp = window.createRequest();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return xmlhttp;<br>}</div>
<div class=code><br><span class=emphasis>function OnReadyStateChng(xmlhttp, a)</span><br>{<br>&nbsp;&nbsp;&nbsp; if (xmlhttp.readyState == 4)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xmlhttp.status == 200)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById(a).innerHTML = a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("HTTP 错误，状态码：" + xmlhttp.status);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</div>
<div class=code><br>function SubmitMsg(<span class=emphasis>a</span>)<br>{<br>&nbsp;&nbsp;&nbsp; <span class=emphasis>var xmlhttp = CreateHTTPObject();</span><br>&nbsp;&nbsp;&nbsp; if (!xmlhttp)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; //无法创建 xmlhttp 对象<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //Ajax 提交<br>&nbsp;&nbsp;&nbsp; xmlhttp.open("GET", "ajax_process.aspx?a=" + a, true);<br>&nbsp;&nbsp;&nbsp; <span class=emphasis>xmlhttp.onreadystatechange = function () { OnReadyStateChng(xmlhttp, a); };</span><br>&nbsp;&nbsp;&nbsp; xmlhttp.send(null);<br>}</div>
<div class=code>SubmitMsg("a1");<br>SubmitMsg("a2");<br>SubmitMsg("a3");</div>
<div class=code>--&gt;<br>&lt;/script&gt;</div>
<div class=code>&lt;/body&gt;</div>
<div class=code>&lt;/html&gt;</div>
<p><span class=itemTitle>后台程序</span></p>
<div class=code>&lt;%@ Page Language="C#" %&gt;<br>&lt;%Response.Expires = 0; %&gt;</div>
<div class=code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</div>
<div class=code>&lt;script runat="server"&gt;<br>&nbsp;&nbsp;&nbsp; void Page_Load(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Request.QueryString["a"] == "a1")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.Thread.Sleep(3000); //延时 3 秒<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (Request.QueryString["a"] == "a2")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.Thread.Sleep(1000); //延时 1 秒<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (Request.QueryString["a"] == "a3")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Threading.Thread.Sleep(2000); //延时 2 秒<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&lt;/script&gt;</div>
<div class=code>&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;<br>&lt;head runat="server"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title&gt;Ajax Test&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;form id="form1" runat="server"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</div>
<p><span class=itemTitle>演示解说</span></p>
<p>前台页面发出三个异步回送请求，分别为 a1、a2、a3 请求值，在后台页面中，通过延时模拟处理 a1 需要 3 秒，处理 a2 需要 1 秒，处理 a3 需要 2 秒。通过演示发现最先有变化的是 a2，然后是 a3、a1，顺序并没有乱，也没有出现显示混乱的情况。注意后台页面需要 Response.Expires = 0; 这么一句代码指示页面立即过期，否则刷新时请求的是缓存的页面，演示也就没有效果了。</p>
<p><span class=itemTitle>另外</span></p>
<p>每个 xmlhttp 的 onreadystatechange 对应的函数名称也可以不同，不仅限于参数不同。<br><br><a href="http://www.cftea.com/c/2007/09/ZO75JIETY8KK76RZ.asp">http://www.cftea.com/c/2007/09/ZO75JIETY8KK76RZ.asp</a></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-11-22 06:10 <a href="http://www.phpweblog.net/killjin/archive/2007/11/22/2367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>