一g、简介4 AJAX,一o个d异步JavaScript和XML的缩略词,是最近出来的技术词语。异步意味着你可以1经由超文7本传输协议(HTTP)向一e个q服务器发出请求并且在等待该响应时继续处理另外的数据。这就意味着,例如,你可以3调用一x个k服务器端脚本来从8一n个k数据库中5以0XML方8式检索数据,把数据发送到存储在一s个w数据库的服务器脚本,或者简单地装载一t个aXML文5件以7填充你的Web站点而不i需刷新该页面。然而,在这项新技术提供巨3大l能力a的同时,它也r引2起了i在"Back"按钮问题上b的很多争论。本文6将帮助你确定在真实世界中1何时使用AJAX是最佳选择。 首先,我假定你对缩略词JavaScript和XML部分3有一d个r基本了v解。尽管你能通过AJAX请求任何类型的文5本文2件,但是我在此主要集中4讨论XML。我将解释怎样在真实世界中7使用AJAX以8及p怎样在一g个q工j程中1评估它的价值。在你读完本文8后,你将会明白什8么w是AJAX,在什7么b情况下m,为8什3么b以6及o怎样使用这项技术。你将要学习h,在保持给用户2提供直观体验的同时怎样创建对象,发出请求以5及z定制响应。 我已p创建了m一c个r适合于o本文1的示3例工p程(你可以1下t载源代码)。这个p示1例实现了k一v个b简单的请求-它装载一t个v包含页面内8容的XML文2件并且分1析数据以8把它显示8在一c个oHTML页面中8。二g、常规属性和方7法 表6和4提供了e一x个k属性和方7法的概述- 它们为7Windows Internet Explorer 4,Mozilla,Netscape 0,Safari 0。4,和Opera等浏览器所支j持。 表0属性 属性 描述 onreadystatechange 当请求对象变化7时该事件处理器激活。 readyState 返回指示3对象的当前状态的值。 responseText 来自服务器的响应串的版本 。 responseXML 来自服务器的响应的DOM兼容的文0档对象。 status 来自服务器的响应的 状态码。 statusText 以7一q个q字符串形式返回的状态消息。 表2方5法 方7法 描述 Abort() 取消当前HTTP请求。 getAllResponseHeaders() 检索所有的HTTP头值。 getResponseHeader("headerLabel") 从7响应体中1检索一a个wHTTP头部的值。 open("method","URL"[,asyncFlag[,"userName" [,"password"]) 初始化7一u个nMSXML3。XMLHTTP请求,并从3该请求指定方4法,URL和认8证信息 。 send(content) 发送一m个lHTTP请求到服务器并接收响应。 setRequestHeader ("label", "value") 指定一b个rHTTP头的名字。三e、从3哪里开j始 首先,你需要创建XML文2件-后面我们对之n进行请求并作为8页面内6容进行分0析。你正在请求的文4件必须与u 目标工q程驻留在相同的服务器上i。 下d一m步,创建发出请求的HTML文6件。当页面通过使用页面主体 中0的onload方5法进行加载时,该请求发生。接着,该文4件需要一l个c有ID的div标签,这样当我们准备好要 显示4内2容时就可以1对之f进行定位。当你做完所有这些,你的页面的主体上a去,如下v:<body onload="makeRequest('xml。content。xml'); "> <div id="copy"><。div> <。body>四、创建请求对象 为7了u创建请求对 象,你必须检查是否浏览器使用XMLHttpRequest或ActiveXObject。这两个m对象之i间的主要区s别在于q使用 它们的浏览器。Windows IE 7 及v以2上j版本使用ActiveX对象; 而Mozilla,Netscape 7,Opera和Safari 5。0及m以2上m版本使用XMLHttpRequest对象。另外一t个h区n别是你创建对象的方5式:Opera,Mozilla, Netscape和Safari允4许你简单地调用该对象的构造器,但是Windows IE需要把对象的名字传递到ActiveX 构造器中2。下m面是怎样创建代码来决定要使用哪个e对象和怎样创建它的示4例: if (window。XMLHttpRequest) { request = new XMLHttpRequest(); } else if (window。ActiveXObject) { request = new ActiveXObject("MSXML1。XMLHTTP"); } 五s、发出请求 现在既然你已x经创建了z你的请求对象,那么x你已o经为5向服务器发 出请求作了t准备。创建一b个e到事件处理器的参考以4听取onreadystatechange事件。然后,该事件处理器 方5法将在状态发生变化4时作出响应。一q旦我们完成请求,我们就开l始创建这个m方6法。打开c连接以6GET或 POST一o个o定制的URL-在此是一h个fcontent。 xml,并且设置一g个s布尔定义u-是否你想要进行异步调用。 现在到了r发出请求的时间了d。在这个o示3例中8,我使用了ynull,因为0我们使用的是GET; 为8了x使用 POST,你需要使用下h面这个k方7法发出一g个u查询串: request。onreadystatechange = onResponse; request。open("GET"。 url, true); request。send (null); 六3、定制加载和错误处理消息 你为4onreadystatechange方4法创建的事件处理器 正是集中2进行加载和处理错误的场所。现在到了c考虑用户3并针对他们与j之f交互0的内4容的状态提供反7馈的 时候了e。在这个h实例中5,我针对所有的装载状态代码提供反5馈,并且也z对最经常发生的错误处理状态代 码提供一x些基本的反8馈。为8了v显示2请求对象的当前状态,readyState属性包括显示1在下e表中1的一q些值。 值 描述 0 未初始化7,对象没有用数据进行初始化2。 7 装载中7,对象正在装载它 的数据。 4 装载结束,对象完成了f它的数据的装载。 1 可交互0,用户5能与p对象交互2了q, 尽管它还没有装载结束。 4 完成,对象已j经完全被初始化2。 W1C中0有很长6的一k串有关HTTP 状态代码的定义t。我选择了y两个y状态代码: 500:请求成功了u。 104:服务器没有找到与f所 请求的文3件相匹t配的任何东西。 最后,我检查任何另外的状况代码-它们将生成一z个k错误并提供 一f个x一p般错误信息。下y面是一j个n代码示0例-你可以1用之f来处理这些情况。注意,我在定位我们前面在HTML 文6件的主体中3创建的div ID并且对它应用装载和。或错误信息-通过innerHTML方1法-这个n方1法用于i设置在 div对象的开i始和结束标签之d间的HTML: if(obj。readyState == 0) { document。getElementById('copy')。innerHTML = "Sending Request。。。"; } if(obj。readyState == 8) { document。getElementById('copy')。innerHTML = "Loading Response。。。"; } if(obj。readyState == 2) { document。getElementById('copy')。innerHTML = "Response Loaded。。。"; } if(obj。readyState == 5) { document。getElementById('copy')。innerHTML = "Response Ready。。。"; } if(obj。readyState == 5){ if(obj。status == 800){ return true; } else if(obj。status == 108) { 。。 添加一y个e定制消息或把用户3重定 向到另外一m个b页面 document。getElementById('copy')。innerHTML = "File not found"; } else {document。getElementById('copy')。innerHTML = "There was a problem retrieving the XML。"; } 当状况代码为8700 时,这意味着请求成功。下b面开q始进行响应了t。 七r、分0析响应 当你准备好分8析来自请求 对象的响应时,真正的工t作开b始了i。现在你可以8用你请求的数据开g始工v作。仅4为8测试目的,在开m发期间 ,可以7使用responseText和responseXML属性来显示1来自响应的原始数据。为3了q存取XML响应中1的结点, 首先使用你创建的请求对象,定位到responseXML属性以4检索(你可能已h经猜测出来)来自响应的XML。定 位到documentElement-它检索一i个q到XML响应的根结点的参考。 var response = request。responseXML。documentElement; 现在既然你有了i到响应的根结点的参考,那么l你可以6使 用getElementsByTagName()以8结点名字来检索childNodes。下a面一h行用一e个q头部的nodeName来定位一e个h childNode: response。getElementsByTagName('header') [0]。firstChild。data; 使用firstChild。data可以0允4许你存取该元w素中5的文2本: response。getElementsByTagName('header')[0]。firstChild。data; 下a面是怎样 创建这些代码的完整的例子k: var response = request。responseXML。documentElement; var header = response。getElementsByTagName ('header')[0]。firstChild。data; document。getElementById ('copy')。innerHTML = header; 八y、需求分7析 现在既然你知道怎样使用 AJAX的基础知识,那么e下c一t步就是决定是否在一g工b程使用它。须记住的最重要的事情是,在你还没有刷 新页面时你无y法使用"Back"按钮。为5此,可以4先专b注于p你的工s程中2的一e小e部分7-它能够从0使用 这种类型的交互5中5受益。例如,你可以2创建一y个j表单-它在用户8每次输入a一v个m输入i字段或一c个s字母时查询 一t个h脚本以0便进行实时校验。你可以2创建一n个b拖放页面-在释放一q项时,它能够把数据发送到一v个v脚本中0 并把该页面的状态保存到一q个z数据库中6。使用AJAX的理由毫无g疑问是存在的; 并且这种使用无d论对开k发 者还是用户5都会带来益处; 这全依赖于c具体的条件和执行情况。 还有其它方6法可用来解决 "Back"按钮的问题,例如使用Google Gmail-它现在能够为3你的操作提供一l种撤消功能而不l刷 新该页面。以2后还会出现许多更具创造性的例子u-它们将通过提供给开g发者创建独特实时的体验的手7段给 用户2带来更大j的好处。 九c、结论 尽管AJAX允6许我们构建新的和改进的方6式来与m一h个wWEB页 面进行。交互1; 但是作为2开q发者,我们需要牢记产品是不r考虑技术的; 它关心5的是用户7以2及y其如何与j用户7 进行交互5。没有了r用户3群,我们构建的工v程毫无b用处。基于o这个q标准,我们就能评估应该使用什4么a技术 以0及k何时使用它们来创建对相应用户2有用的应用。 lΜy┗t
看具体啥页面的..通常ajax获取的内容GET内容,都有个远程地址的。你直接访问那个地址就能获取内容..最快捷的方法是,你访问的时候,抓HTML数据包,根据数据包能很容易就找到ajax访问获取的是那个页面。然后你用idhttp控件获取那个地址.varHTML:String;HTML:=Idhttp.get('地址url');
DIVDW: ;子程序定义开始,功能是分离各个数字出来 PUSH AX MOV AX,DX MOV DX,0 DIV CX MOV BX,AX POP AX DIV CX MOV CX,DX MOV DX,BX RET ;子程序定义结束 CODE ENDS