阅读提要 AJAX,一个异步javascript和XML的缩略词,是当今快速发展的Web开发界十分热门的技术。在这项新技术提供巨大能力的同时,它也燃发了在"Back"按钮问题上的不容置疑的争论。本文作者将向你解释怎样在真实世界中使用AJAX以及怎样在一个工程中评估它的价值。在你读完本文后,你就会明白什么是AJAX,在什么情况下,为什么以及怎样使用这项技术。
  一、 简介
  AJAX,一个异步javascript和XML的缩略词,是最近出来的技术词语。异步意味着你可以经由超文本传输协议(HTTP)向一个服务器发出请求并且在等待该响应时继续处理另外的数据。这就意味着,例如,你可以调用一个服务器端脚本来从一个数据库中以XML方式检索数据,把数据发送到存储在一个数据库的服务器脚本,或者简单地装载一个XML文件以填充你的Web站点而不需刷新该页面。然而,在这项新技术提供巨大能力的同时,它也引起了在"Back"按钮问题上的很多争论。本文将帮助你确定在真实世界中何时使用AJAX是最佳选择。
  首先,我假定你对缩略词javascript和XML部分有一个基本了解。尽管你能通过AJAX请求任何类型的文本文件,但是我在此主要集中讨论XML。我将解释怎样在真实世界中使用AJAX以及怎样在一个工程中评估它的价值。在你读完本文后,你将会明白什么是AJAX,在什么情况下,为什么以及怎样使用这项技术。你将要学习,在保持给用户提供直观体验的同时怎样创建对象,发出请求以及定制响应。
  我已创建了一个适合于本文的示例工程(你可以下载源代码)。这个示例实现了一个简单的请求-它装载一个包含页面内容的XML文件并且分析数据以把它显示在一个HTML页面中。
  二、 常规属性和方法
  表1和2提供了一个属性和方法的概述-它们为Windows Internet Explorer 5,Mozilla,Netscape 7,Safari 1.2,和Opera等浏览器所支持。
  表1属性
| 属性 | 描述 | 
| onreadystatechange | 当请求对象变化时该事件处理器激活。 | 
| readyState | 返回指示对象的当前状态的值。 | 
| responseText | 来自服务器的响应串的版本。 | 
| responseXML | 来自服务器的响应的DOM兼容的文档对象。 | 
| status | 来自服务器的响应的状态码。 | 
| statusText | 以一个字符串形式返回的状态消息。 | 
| 方法 | 描述 | 
| Abort() | 取消当前HTTP请求。 | 
| getAllResponseHeaders() | 检索所有的HTTP头值。 | 
| getResponseHeader("headerLabel") | 从响应体中检索一个HTTP头部的值。 | 
| open("method","URL"[,asyncFlag[,"userName"[,"password"]]]) | 初始化一个MSXML2.XMLHTTP请求,并从该请求指定方法,URL和认证信息。 | 
| send(content) | 发送一个HTTP请求到服务器并接收响应。 | 
| setRequestHeader("label", "value") | 指定一个HTTP头的名字。 | 
| <body onload="makeRequest('xml/content.xml');"> <div id="copy"></div> </body>  | 
| if(window.XMLHttpRequest) { request = new XMLHttpRequest();} else if(window.ActiveXObject) { request = new ActiveXObject("MSXML2.XMLHTTP");}  | 
| request.onreadystatechange = onResponse; request.open("GET". url, true); request.send(null);  | 
| 值 | 描述 | 
| 0 | 未初始化,对象没有用数据进行初始化。 | 
| 1 | 装载中,对象正在装载它的数据。 | 
| 2 | 装载结束,对象完成了它的数据的装载。 | 
| 3 | 可交互,用户能与对象交互了,尽管它还没有装载结束。 | 
| 4 | 完成,对象已经完全被初始化。 | 
| if(obj.readyState == 0) { document.getElementById('copy').innerHTML = "Sending Request...";} if(obj.readyState == 1) { document.getElementById('copy').innerHTML = "Loading Response...";} if(obj.readyState == 2) { document.getElementById('copy').innerHTML = "Response Loaded...";} if(obj.readyState == 3) { document.getElementById('copy').innerHTML = "Response Ready...";} if(obj.readyState == 4){ if(obj.status == 200){ return true; } else if(obj.status == 404) { // 添加一个定制消息或把用户重定向到另外一个页面 document.getElementById('copy').innerHTML = "File not found"; } else {document.getElementById('copy').innerHTML = "There was a problem retrieving the XML."; } }  | 
| var response = request.responseXML.documentElement; | 
| response.getElementsByTagName('header')[0].firstChild.data; | 
| response.getElementsByTagName('header')[0].firstChild.data; | 
| var response = request.responseXML.documentElement; var header = response.getElementsByTagName('header')[0].firstChild.data; document.getElementById('copy').innerHTML = header;  | 
新闻热点
疑难解答
图片精选