掌握 Ajax(一): Ajax 入门简介

  Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 Ajax 专家,他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 —— 使高效的 Web 开发成为现实。他还揭开了 Ajax 核心概念的神秘面纱,包括 XMLHttpRequest 对象。

  五年前,如果不知道 XML,您就是一只无人重视的丑小鸭。十八个月前,Ruby 成了关注的中心,不知道 Ruby 的程序员只能坐冷板凳了。今天,如果想跟上最新的技术时尚,那您的目标就是 Ajax。

  但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。

  但在详细探讨 Ajax 是什么之前,先让我们花几分钟了解 Ajax 做 什么。目前,编写应用程序时有两种基本的选择:

  两者是类似的,桌面应用程序通常以 CD 为介质(有时候可从网站下载)并完全安装到您的计算机上。桌面应用程序可能使用互联网下载更新,但运行这些应用程序的代码在桌面计算机上。Web 应用程序运行在某处的 Web 服务器上 —— 毫不奇怪,要通过 Web 浏览器访问这种应用程序。

  不过,比这些应用程序的运行代码放在何处更重要的是,应用程序如何运转以及如何与其进行交互。桌面应用程序一般很快(就在您的计算机上运行,不用等待互联网连接),具有漂亮的用户界面(通常和操作系统有关)和非凡的动态性。可以单击、选择、输入、打开菜单和子菜单、到处巡游,基本上不需要等待。

  另一方面,Web 应用程序是最新的潮流,它们提供了在桌面上不能实现的服务(比如 Amazon.com 和 eBay)。但是,伴随着 Web 的强大而出现的是等待,等待服务器响应,等待屏幕刷新,等待请求返回和生成新的页面。

  显然这样说过于简略了,但基本的概念就是如此。您可能已经猜到,Ajax 尝试建立桌面应用程序的功能和交互性,与不断更新的 Web 应用程序之间的桥梁。可以使用像桌面应用程序中常见的动态用户界面和漂亮的控件,不过是在 Web 应用程序中。
  还等什么呢?我们来看看 Ajax 如何将笨拙的 Web 界面转化成能迅速响应的 Ajax 应用程序吧。

  老技术,新技巧

  在谈到 Ajax 时,实际上涉及到多种技术,要灵活地运用它必须深入了解这些不同的技术(本系列的头几篇文章将分别讨论这些技术)。好消息是您可能已经非常熟悉其中的大部分技术,更好的是这些技术都很容易学习,并不像完整的编程语言(如 Java 或 Ruby)那样困难。

  下面是 Ajax 应用程序所用到的基本技术:

  • HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。
  • JavaScript 代码是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信。
  • DHTML 或 Dynamic HTML,用于动态更新表单。我们将使用 div、span 和其他动态 HTML 元素来标记 HTML。
  • 文档对象模型 DOM 用于(通过 JavaScript 代码)处理 HTML 结构和(某些情况下)服务器返回的 XML。

  我们来进一步分析这些技术的职责。以后的文章中我将深入讨论这些技术,目前只要熟悉这些组件和技术就可以了。对这些代码越熟悉,就越容易从对这些技术的零散了解转变到真正把握这些技术(同时也真正打开了 Web 应用程序开发的大门)。

  XMLHttpRequest 对象

  要了解的一个对象可能对您来说也是最陌生的,即 XMLHttpRequest。这是一个 JavaScript 对象,创建该对象很简单,如清单 1 所示。

  清单 1. 创建新的 XMLHttpRequest 对象

<script language="Javascript" type="text/Javascript">
var xmlHttp
= new XMLHttpRequest();
</script>

 

  加入一些 JavaScript

  得到 XMLHttpRequest 的句柄后,其他的 JavaScript 代码就非常简单了。事实上,我们将使用 JavaScript 代码完成非常基本的任务:

  • 获取表单数据:JavaScript 代码很容易从 HTML 表单中抽取数据并发送到服务器
  • 修改表单上的数据:更新表单也很简单,从设置字段值到迅速替换图像。
  • 解析 HTML 和 XML:使用 JavaScript 代码操纵 DOM(请参阅 下一节),处理 HTML 表单服务器返回的 XML 数据的结构。

  对于前两点,需要非常熟悉 getElementById() 方法,如 清单 2 所示。

  清单 2. 用 JavaScript 代码捕获和设置字段值

// Get the value of the "phone" field and stuff it in a variable called phone
var phone
= document.getElementById("phone").value;
// Set some values on a form using an array called response
document.getElementById(
"order").value = response[0];
document.getElementById(
"address").value = response[1];


  获取 Request 对象

 

  有了上面的基础知识后,我们来看看一些具体的例子。XMLHttpRequest 是 Ajax 应用程序的核心,而且对很多读者来说可能还比较陌生,我们就从这里开始吧。从 清单 1 可以看出,创建和使用这个对象非常简单,不是吗?等一等。

  还记得几年前的那些讨厌的浏览器战争吗?没有一样东西在不同的浏览器上得到同样的结果。不管您是否相信,这些战争仍然在继续,虽然规模较小。但令人奇怪的是,XMLHttpRequest 成了这场战争的牺牲品之一。因此获得 XMLHttpRequest 对象可能需要采用不同的方法。下面我将详细地进行解释。

  使用 Microsoft 浏览器

  Microsoft 浏览器 InterNET Explorer 使用 MSXML 解析器处理 XML(可以通过 参考资料 进一步了解 MSXML)。因此如果编写的 Ajax 应用程序要和 InterNET Explorer 打交道,那么必须用一种特殊的方式创建对象。

  但并不是这么简单。根据 InterNET Explorer 中安装的 JavaScript 技术版本不同,MSXML 实际上有两种不同的版本,因此必须对这两种情况分别编写代码。请参阅 清单 3,其中的代码在 Microsoft 浏览器上创建了一个 XMLHttpRequest。

清单 3. 在 Microsoft 浏览器上创建 XMLHttpRequest 对象

 

Code
var xmlHttp = false;
try {
xmlHttp
= new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp
= new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp
= false;
}
}


  结合起来

  关键是要支持所有 浏览器。谁愿意编写一个只能用于 InterNET Explorer 或者非 Microsoft 浏览器的应用程序呢?或者更糟,要编写一个应用程序两次?当然不!因此代码要同时支持 InterNET Explorer 和非 Microsoft 浏览器。清单 4 显示了这样的代码。

 

  清单 4. 以支持多种浏览器的方式创建 XMLHttpRequest 对象

 

/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp
= false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp
= new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp
= new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp
= false;
}
}
@
end @*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}

  Ajax 世界中的请求/响应

  现在我们介绍了 Ajax,对 XMLHttpRequest 对象以及如何创建它也有了基本的了解。如果阅读得很仔细,您可能已经知道与服务器上的 Web 应用程序打交道的是 JavaScript 技术,而不是直接提交给那个应用程序的 HTML 表单。

  还缺少什么呢?到底如何使用 XMLHttpRequest。因为这段代码非常重要,您编写的每个 Ajax 应用程序都要以某种形式使用它,先看看 Ajax 的基本请求/响应模型是什么样吧。

  发出请求

  您已经有了一个崭新的 XMLHttpRequest 对象,现在让它干点活儿吧。首先需要一个 Web 页面能够调用的 JavaScript 方法(比如当用户输入文本或者从菜单中选择一项时)。接下来就是在所有 Ajax 应用程序中基本都雷同的流程:

   1. 从 Web 表单中获取需要的数据。
   2. 建立要连接的 URL。
   3. 打开到服务器的连接。
   4. 设置服务器在完成后要运行的函数。
   5. 发送请求。

  清单 5 中的示例 Ajax 方法就是按照这个顺序组织的:

 

 

function callServer() {
// Get the city and state from the web form
var city
= document.getElementById("city").value;
var state
= document.getElementById("state").value;
// Only go on if there are values for both fields
if ((city == null) || (city == "")) return;
if ((state == null) || (state == "")) return;
// Build the URL to connect to
var url
= "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state);
// Open a connection to the server
xmlHttp.open(
"GET", url, true);
// Setup a function for the server to run when it's done
xmlHttp.onreadystatechange = updatePage;
// Send the request
xmlHttp.send(
null);
}

 

  处理响应

  现在要面对服务器的响应了。现在只要知道两点:

    * 什么也不要做,直到 xmlHttp.readyState 属性的值等于 4。
    * 服务器将把响应填充到 xmlHttp.responseText 属性中。

  其中的第一点,即就绪状态,将在下一篇文章中详细讨论,您将进一步了解 HTTP 请求的阶段,可能比您设想的还多。现在只要检查一个特定的值(4)就可以了(下一期文章中还有更多的值要介绍)。第二点,使用 xmlHttp.responseText 属性获得服务器的响应,这很简单。清单 6 中的示例方法可供服务器根据 清单 5 中发送的数据调用。


清单 6. 处理服务器响应

 

function updatePage() {
if (xmlHttp.readyState == 4) {
var response
= xmlHttp.responseText;
document.getElementById(
"zipCode").value = response;
}
}

NET技术掌握 Ajax(一): Ajax 入门简介,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。