`
happmaoo
  • 浏览: 4340883 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ajax基础篇

阅读更多
1. 理解Ajax:
keywords: HTTP, 同步, Ajax, 异步, JavaScript

a) HTTP协议,同步的,client向server发送请求后需要等待直到server响应;
b) Ajax(Asynchronous JavaScript and XML)实现client和server间的异步:
即client进行操作的时候,背后的JS代表用户与server进行请求和响应的过程,并将相应在页面中进行更新;

2. Ajax技术要素:
keywords: XHTML,CSS,JavaScript,DOM | server端任意(只要能够获取client的请求并能够响应即可)

a)client端首先是一个html页面(包含CSS的),用户操作的同时(通常是event-driven),驱动JS(XMLHttpRequest对象)代表用户在后台与server进行交互,并将server的响应反映到html页面中(JS的DOM操作修改内容或CSS操作修改视觉效果)
b)从server端来看,随时等待JS的XMLHttpRequest对象发来的请求,做出逻辑处理後,将响应发送回去;

c)因此需要的技术:
client端,除了XHTML+CSS之外,主要在于JavaScript,其中核心的XMLHttpRequest对象使用很简单,难点在于如何使用JS的强大功能将server端的响应在页面中以DOM修改内容或CSS修改外观的形式展示给用户;(因此JS的功能在这里很重要)。
server端,没有什么限制,PHP|Perl|ASP.NET|JSP|Python|Ruby等都差别不大,而且都很类似,根据请求完成逻辑响应,并将响应内容返回client端的JS。

3. Ajax应用程序架构:
keywords: .html(.css) .js .php(...)

a)首先是一个html页面,其中有event-driven的js事件响应函数入口;
b)当用户操作的事件驱动了js,js需要
定义并创建一个XMLHttpRequest对象var xmlHttp;
事件响应函数中:对象xmlHttp设置回调函数onreadystatechange(即server端有响应的时候就激发这个函数);open(请求server端);send;<这里是核心>
回调函数的定义:即对server端的响应进行处理(主要是通过JS对DOM或CSS进行操作进而在页面中有变化);<这里是难点>
c)server端,只需要根据client端js发来的请求,进行逻辑操作(读写数据库,xml处理等)后将响应返回<这一步完成后会触发js的onreadystatechange>

4. Ajax的核心XMLHttpRequest对象其实很简单:
keywords: XMLHttpRequest对象, 属性, 方法

a)属性:
onreadystatechange:保存回调函数句柄;
readystate:保存响应的状态,0未初始化;1正在加载;2已加载;3交互中;4完成;
status:server的HTTP状态码,200对于OK,404对于Not Found等等;
statusText: HTTP状态码的文本(Ok,Not Found等)
responseText:server响应文本格式;
reaponseXML:server响应XML格式,JS当作DOM轻松解析;
b)方法:
open("method", "url", "")
send(content)

setRequestHeader("header","value")
abort()
getAllResponseHeaders()
getResponseHeader("header")

5. Ajax应用程序简例:
a) HTML部分index.html
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title>simpleAjax</title>
<scripttype="text/javascript"src="ajax.js"></script>
</head>
<bodyonload='process()'>
Serverwantstoknowyourname:
<inputtype="text"id="name"/>
<divid="serverResponse"/>
</body>
</html>

b)JavaScript部分ajax.js
///////////////////////////////////////////////////
//
//第一部分:创建一个XMLHttpRequest对象
//
/////////////////////////////////////////////////
varxmlHttp=createXmlHttpRequestObject();

functioncreateXmlHttpRequestObject()
...{
varxmlHttp;
//ifrunningInternetExplorer
if(window.ActiveXObject)
...{
try
...{
xmlHttp
=newActiveXObject("Microsoft.XMLHTTP");
}

catch(e)
...{
xmlHttp
=false;
}

}

//ifrunningMozillaorotherbrowsers
else
...{
try
...{
xmlHttp
=newXMLHttpRequest();
}

catch(e)
...{
xmlHttp
=false;
}

}

//returnthecreatedobjectordisplayanerrormessage
if(!xmlHttp)

alert(
"ErrorcreatingtheXMLHttpRequestobject.");
else
returnxmlHttp;
}


///////////////////////////////////////////////////
//
//第二部分:HTML页面中event-driven这个JS函数向server异步请求
//
/////////////////////////////////////////////////
functionprocess()
...{
//proceedonlyifthexmlHttpobjectisn'tbusy(在xmlHttp不忙时处理)
if(xmlHttp.readyState==4||xmlHttp.readyState==0)
...{
//retrievethenametypedbytheuserontheform
name=encodeURIComponent(document.getElementById("name").value);

//executetheserver.phppagefromtheserver
xmlHttp.open("GET","server.php?name="+name,true);
//definethemethodtohandleserverresponses(server响应会回调给函数,在client页面进行更新DOM或者CSS操作)
xmlHttp.onreadystatechange=handleServerResponse;
//maketheserverrequest
xmlHttp.send(null);
}

else
//iftheconnectionisbusy,tryagainafteronesecond
setTimeout('process()',1000);
}


///////////////////////////////////////////////////
//
//第三部分:服务器响应状态会触发该回调函数
//
/////////////////////////////////////////////////
functionhandleServerResponse()
...{
//moveforwardonlyifthetransactionhascompleted
if(xmlHttp.readyState==4)
...{
//statusof200indicatesthetransactioncompletedsuccessfully
if(xmlHttp.status==200)
...{
//如下的操作主要是JS的功能,更形页面DOM或CSS操作
//extracttheXMLretrievedfromtheserver
xmlResponse=xmlHttp.responseXML;
//obtainthedocumentelement(therootelement)oftheXMLstructure
xmlDocumentElement=xmlResponse.documentElement;
//getthetextmessage,whichisinthefirstchildof
//thethedocumentelement
helloMessage=xmlDocumentElement.firstChild.data;
//updatetheclientdisplayusingthedatareceivedfromtheserver
document.getElementById("serverResponse").innerHTML=
'<i>'+helloMessage+'</i>';
//restartsequence
setTimeout('process()',1000);
}

//aHTTPstatusdifferentthan200signalsanerror
else
...{
alert(
"Therewasaproblemaccessingtheserver:"+xmlHttp.statusText);
}

}

}


c) server端PHP脚本server.php
<?php
//server端的PHP脚本产生响应XML格式,直接输入localhost/server.php会显示xml文件(或加上name=参数)
//we'llgenerateXMLoutput

header('Content-Type:text/xml');
//generateXMLheader
echo'<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>';
//createthe<response>element
echo'<response>';

//retrievetheusername
$name=$_GET['name'];
//generateoutputdependingontheusernamereceivedfromclient
$userNames=array('MICHEAL','SANDY','HELLO');
if(in_array(strtoupper($name),$userNames))
echo'Hello,master'.htmlentities($name).'!';
elseif(trim($name)=='')
echo'Stranger,pleasetellmeyourname!';
else
echohtmlentities($name).',Idon'tknowyou!';
//closethe<response>element
echo'</response>';
?>







分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics