AJAX 可用来与数据库进行动态通信?/span>
当用户在上面的下拉列表中选择某个客户Ӟ会执行名?"showCustomer()" 的函数。该函数?"onchange" 事g触发Q?/p>
function showCustomer(str) { var xmlhttp; if (str=="") { document.getElementById("txtHint").innerHTML=""; return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("txtHint").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","getcustomer.asp?q="+str,true); xmlhttp.send(); }
showCustomer() 函数执行以下dQ?/p>
׃面的 JavaScript 调用的服务器面?ASP 文gQ名?"getcustomer.asp"?/p>
?PHP ~写服务器文件也很容易,或者用其他服务器语a。请?a title="PHP ?AJAX MySQL 数据库实? style="margin: 0px; padding: 0px; border: 0px; color: #900b09; background-color: transparent;">?PHP ~写的相应的例子?/p>
"getcustomer.asp" 中的源代码负责对数据库进行查询,然后?HTML 表格q回l果Q?/p>
<% response.expires=-1 sql="SELECT * FROM CUSTOMERS WHERE CUSTOMERID=" sql=sql & "'" & request.querystring("q") & "'" set conn=Server.CreateObject("ADODB.Connection") conn.Provider="Microsoft.Jet.OLEDB.4.0" conn.Open(Server.Mappath("/db/northwind.mdb")) set rs=Server.CreateObject("ADODB.recordset") rs.Open sql,conn response.write("<table>") do until rs.EOF for each x in rs.Fields response.write("<tr><td><b>" & x.name & "</b></td>") response.write("<td>" & x.value & "</td></tr>") next rs.MoveNext loop response.write("</table>") %>
AJAX 用于创造动态性更强的应用E序?/span>
当用户在上面的输入框中键入字W时Q会执行函数 "showHint()" 。该函数?"onkeyup" 事g触发Q?/p>
function showHint(str) { var xmlhttp; if (str.length==0) { document.getElementById("txtHint").innerHTML=""; return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("txtHint").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","gethint.asp?q="+str,true); xmlhttp.send(); }
如果输入框ؓI?(str.length==0)Q则该函数清I?txtHint 占位W的内容Qƈ退出函数?/p>
如果输入框不为空QshowHint() 函数执行以下dQ?/p>
׃面的 JavaScript 调用的服务器面?ASP 文gQ名?"gethint.asp"?/p>
下面Q我们创Z两个版本的服务器文gQ一个用 ASP ~写Q另一个用 PHP ~写?/p>
"gethint.asp" 中的源代码会查一个名字数l,然后向浏览器q回相应的名字:
<% response.expires=-1 dim a(30) '用名字来填充数组 a(1)="Anna" a(2)="Brittany" a(3)="Cinderella" a(4)="Diana" a(5)="Eva" a(6)="Fiona" a(7)="Gunda" a(8)="Hege" a(9)="Inga" a(10)="Johanna" a(11)="Kitty" a(12)="Linda" a(13)="Nina" a(14)="Ophelia" a(15)="Petunia" a(16)="Amanda" a(17)="Raquel" a(18)="Cindy" a(19)="Doris" a(20)="Eve" a(21)="Evita" a(22)="Sunniva" a(23)="Tove" a(24)="Unni" a(25)="Violet" a(26)="Liza" a(27)="Elizabeth" a(28)="Ellen" a(29)="Wenche" a(30)="Vicky" '获得来自 URL ?q 参数 q=ucase(request.querystring("q")) '如果 q 大于 0Q则查找数组中的所有提C?/span> if len(q)>0 then hint="" for i=1 to 30 if q=ucase(mid(a(i),1,len(q))) then if hint="" then hint=a(i) else hint=hint & " , " & a(i) end if end if next end if '如果未找到提C,则输?"no suggestion" '否则输出正确的?/span> if hint="" then response.write("no suggestion") else response.write(hint) end if %>
下面的代码用 PHP ~写Q与上面?ASP 代码作用是一L?/p>
注释Q?/span>如需?PHP 中运行这个例子,请将 url 变量的|Javascript 代码中)?"gethint.asp" 改ؓ "gethint.php"?/p><?php // 用名字来填充数组 $a[]="Anna"; $a[]="Brittany"; $a[]="Cinderella"; $a[]="Diana"; $a[]="Eva"; $a[]="Fiona"; $a[]="Gunda"; $a[]="Hege"; $a[]="Inga"; $a[]="Johanna"; $a[]="Kitty"; $a[]="Linda"; $a[]="Nina"; $a[]="Ophelia"; $a[]="Petunia"; $a[]="Amanda"; $a[]="Raquel"; $a[]="Cindy"; $a[]="Doris"; $a[]="Eve"; $a[]="Evita"; $a[]="Sunniva"; $a[]="Tove"; $a[]="Unni"; $a[]="Violet"; $a[]="Liza"; $a[]="Elizabeth"; $a[]="Ellen"; $a[]="Wenche"; $a[]="Vicky"; //获得来自 URL ?q 参数 $q=$_GET["q"]; //如果 q 大于 0Q则查找数组中的所有提C?/span> if (strlen($q) > 0) { $hint=""; for($i=0; $i<count($a); $i++) { if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q)))) { if ($hint=="") { $hint=$a[$i]; } else { $hint=$hint." , ".$a[$i]; } } } } // 如果未找到提C,则把输出讄?"no suggestion" // 否则讄为正的?/span> if ($hint == "") { $response="no suggestion"; } else { $response=$hint; } //输出响应 echo $response; ?>
当请求被发送到服务器时Q我们需要执行一些基于响应的d?/p>
每当 readyState 改变Ӟ׃触发 onreadystatechange 事g?/p>
readyState 属性存?XMLHttpRequest 的状态信息?/p>
下面?XMLHttpRequest 对象的三个重要的属性:
属?/th> | 描述 |
---|---|
onreadystatechange | 存储函数Q或函数名)Q每?readyState 属性改变时Q就会调用该函数?/td> |
readyState | 存有 XMLHttpRequest 的状态。从 0 ?4 发生变化?/p>
|
status | 200: "OK" 404: 未找到页?/p> |
?onreadystatechange 事g中,我们规定当服务器响应已做好被处理的准备时所执行的Q务?/p>
?readyState {于 4 且状态ؓ 200 Ӟ表示响应已就l:
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
注释Q?/span>onreadystatechange 事g被触?5 ơ(0 - 4Q,对应着 readyState 的每个变化?/p> callback 函数是一U以参数形式传递给另一个函数的函数?/p> 如果您的|站上存在多?AJAX dQ那么您应该为创?XMLHttpRequest 对象~写一?span style="margin: 0px; padding: 0px; border: 0px; font-weight: bold;">标准的函敎ͼqؓ每个 AJAX d调用该函数?/p> 该函数调用应该包?URL 以及发生 onreadystatechange 事g时执行的dQ每ơ调用可能不相同)Q?/p>使用 Callback 函数
function myFunction() { loadXMLDoc("ajax_info.txt",function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }); }
]]>
如需获得来自服务器的响应Q请使用 XMLHttpRequest 对象?responseText ?responseXML 属性?/p>
属?/th> | 描述 |
---|---|
responseText | 获得字符串Ş式的响应数据?/td> |
responseXML | 获得 XML 形式的响应数据?/td> |
如果来自服务器的响应q XMLQ请使用 responseText 属性?/p>
responseText 属性返回字W串形式的响应,因此您可以这样用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
如果来自服务器的响应?XMLQ而且需要作?XML 对象q行解析Q请使用 responseXML 属性:
h books.xml 文gQƈ解析响应Q?/p>
xmlDoc=xmlhttp.responseXML; txt=""; x=xmlDoc.getElementsByTagName("ARTIST"); for (i=0;i<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br />"; } document.getElementById("myDiv").innerHTML=txt;
如需获得来自服务器的响应Q请使用 XMLHttpRequest 对象?responseText ?responseXML 属性?/p>
属?/th> | 描述 |
---|---|
responseText | 获得字符串Ş式的响应数据?/td> |
responseXML | 获得 XML 形式的响应数据?/td> |
如果来自服务器的响应q XMLQ请使用 responseText 属性?/p>
responseText 属性返回字W串形式的响应,因此您可以这样用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
如果来自服务器的响应?XMLQ而且需要作?XML 对象q行解析Q请使用 responseXML 属性:
h books.xml 文gQƈ解析响应Q?/p>
xmlDoc=xmlhttp.responseXML; txt=""; x=xmlDoc.getElementsByTagName("ARTIST"); for (i=0;i<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br />"; } document.getElementById("myDiv").innerHTML=txt;
XMLHttpRequest 对象用于和服务器交换数据?/span>
如需请求发送到服务器,我们使用 XMLHttpRequest 对象?open() ?send() ҎQ?/p>
xmlhttp.open("GET","test1.txt",true); xmlhttp.send();
Ҏ | 描述 |
---|---|
open(method,url,async) | 规定h的类型、URL 以及是否异步处理h?/p>
|
send(string) | 请求发送到服务器?/p>
|
?POST 相比QGET 更简单也更快Qƈ且在大部分情况下都能用?/p>
然而,在以下情况中Q请使用 POST hQ?/p>
一个简单的 GET hQ?/p>
xmlhttp.open("GET","demo_get.asp",true); xmlhttp.send();
在上面的例子中,您可能得到的是缓存的l果?/p>
Z避免q种情况Q请?URL d一个唯一?IDQ?/p>
xmlhttp.open("GET","demo_get.asp?t=" + Math.random()
,true); xmlhttp.send();
如果您希望通过 GET Ҏ发送信息,请向 URL d信息Q?/p>
xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true); xmlhttp.send();
一个简?POST hQ?/p>
xmlhttp.open("POST","demo_post.asp",true); xmlhttp.send();
如果需要像 HTML 表单那样 POST 数据Q请使用 setRequestHeader() 来添?HTTP 头。然后在 send() Ҏ中规定您希望发送的数据Q?/p>
xmlhttp.open("POST","ajax_test.asp",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Bill&lname=Gates");
Ҏ | 描述 |
---|---|
setRequestHeader(header,value) | 向请求添?HTTP 头?/p>
|
open() Ҏ?nbsp;url 参数是服务器上文件的地址Q?/p>
xmlhttp.open("GET","ajax_test.asp",true);
该文件可以是Mcd的文Ӟ比如 .txt ?.xmlQ或者服务器脚本文gQ比?.asp ?.php Q在传回响应之前Q能够在服务器上执行dQ?/p>
AJAX 指的是异?JavaScript ?XMLQAsynchronous JavaScript and XMLQ?/p>
XMLHttpRequest 对象如果要用?AJAX 的话Q其 open() Ҏ?async 参数必须讄?trueQ?/p>
xmlhttp.open("GET","ajax_test.asp",true
);
对于 web 开发h员来_发送异步请求是一个巨大的q步。很多在服务器执行的d都相当费时。AJAX 出现之前Q这可能会引起应用程序挂h停止?/p>
通过 AJAXQJavaScript 无需{待服务器的响应Q而是Q?/p>
当?async=true Ӟ误定在响应处于 onreadystatechange 事g中的qA状态时执行的函敎ͼ
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","test1.txt",true); xmlhttp.send();
您将在稍后的章节学习更多有关 onreadystatechange 的内宏V?/p>
如需使用 async=falseQ请?open() Ҏ中的W三个参数改?falseQ?/p>
xmlhttp.open("GET","test1.txt",false);
我们不推荐?async=falseQ但是对于一些小型的hQ也是可以的?/p>
误住,JavaScript 会等到服务器响应qA才l执行。如果服务器J忙或缓慢,应用E序会挂h停止?/p>
注释Q?/span>当您使用 async=false Ӟ请不要编?onreadystatechange 函数 - 把代码放?send() 语句后面卛_Q?/p>xmlhttp.open("GET","test1.txt",false); xmlhttp.send(); document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
XMLHttpRequest ?AJAX 的基?/span>
所有现代浏览器均支?XMLHttpRequest 对象QIE5 ?IE6 使用 ActiveXObjectQ?/p>
XMLHttpRequest 用于在后C服务器交换数据。这意味着可以在不重新加蝲整个|页的情况下Q对|页的某部分q行更新?/p>
所有现代浏览器QIE7+、Firefox、Chrome、Safari 以及 OperaQ均内徏 XMLHttpRequest 对象?/p>
variable=new XMLHttpRequest();
variable=new ActiveXObject("Microsoft.XMLHTTP");
Z应对所有的C览器,包括 IE5 ?IE6Q请查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创?XMLHttpRequest 对象。如果不支持Q则创徏 ActiveXObject Q?/p>
var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
在下一章中Q您学习发送服务器h的知识?/p>
AJAX 是一U在无需重新加蝲整个|页的情况下Q能够更新部分网늚技术?/span>
在l学习之前,您需要对下面的知识有基本的了解:
如果您希望首先学习这些项目,请在我们?a title="W3School 在线教程" style="margin: 0px; padding: 0px; border: 0px; color: #900b09; background-color: transparent;">首页讉Kq些教程?/p>
AJAX = 异步 JavaScript ?XML?/p>
AJAX 是一U用于创建快速动态网늚技术?/p>
通过在后C服务器进行少量数据交换,AJAX 可以使网实现异步更新。这意味着可以在不重新加蝲整个|页的情况下Q对|页的某部分q行更新?/p>
传统的网(不?AJAXQ如果需要更新内容,必需重蝲整个|页面?/p>
有很多?AJAX 的应用程序案例:新浪微博、Google 地图、开心网{等?/p>
?2005 q_Google 通过?Google Suggest ?AJAX 变得行h?/p>
Google Suggest 使用 AJAX 创造出动态性极强的 web 界面Q当您在h的搜索框输入关键字时QJavaScript 会把q些字符发送到服务器,然后服务器会q回一个搜索徏议的列表?/p>
AJAX Z已有的标准。这些标准已被大多数开发者用多q?/p>
请阅M一章,看看 AJAX 是如何工作的Q?/p>
Z帮助您理?AJAX 的工作原理,我们创徏了一个小型的 AJAX 应用E序?/span>
AJAX is not a programming language.
It is just a technique for creating better and more interactive web applications.
上面?AJAX 应用E序包含一?div 和一个按钮?/p>
div 部分用于昄来自服务器的信息。当按钮被点LQ它负责调用名ؓ loadXMLDoc() 的函敎ͼ
<html> <body> <div id="myDiv"><h3>Let AJAX change this text</h3></div> <button type="button" onclick="loadXMLDoc()">Change Content</button> </body> </html>
接下来,在页面的 head 部分d一?<script> 标签。该标签中包含了q个 loadXMLDoc() 函数Q?/p>
<head> <script type="text/javascript"> function loadXMLDoc() { .... AJAX script goes here ... } </script> </head>
下面的章节会为您讲解 AJAX 的工作原理?/p>