您的位置: 首页 > 技术文档 > 网络编程 > 如何使用ajax开发web应用程序
用MVC模型引导你的WEB设计思路 回到列表 asp编译成dll-图形化教程
用户名:
密 码: 忘记密码
注册会员 游客参观 论坛帮助
 如何使用ajax开发web应用程序

作者:Sheneyan 时间: 2006-02-07 文档类型:翻译 来自:蓝色理想
浏览统计 total:9159 | year:9159 | Quarter:1441 | Month:1441 | Week:8 | today:8


如何使用ajax开发web应用程序 [2]
如何使用ajax开发web应用程序 [3]

作者: Jonathan Fenocchi
时间:2005.10.25
译者:Sheneyan
英文原文:
http://webreference.com/programming/javascript/jf/column12/index.html

在过去,由于为了获得新数据而不得不重新加载web页面(或者加载其他页面)导致web应用程序发展被限制。虽然有其他方法可用(不加载其他页面),但是这些技术都没有被很好地支持而且有bug成灾的趋向。在过去的几个月里,一个过去并不被广泛支持的技术已经被越来越多的web冲浪者(web surfers??是指浏览器还是浏览者?)所接受,它给了开发者更多的自由开发先进的web应用程序。这些通过javascript来异步取得xml数据的应用程序,被亲切的称为“Ajax应用程序”(Asynchronous Javascript and XML applications)。在这篇文章中,我将会解释如何通过Ajax来取回一个远程的XML文件并更新一个web page,并且随着这个系列的继续,我将讨论更多的方法,使用ajax技术将你的web应用程序提升到一个新的层次.

这第一步就是创建一个带一些数据的XML文件。我们将这个文件命名为data.xml。它是一个简单的XML文件,而在一个真实的程序中,它会复杂许多,但对于我们的例子来说,简单明了是最合适地。

<?xml version="1.0" encoding="UTF-8"?> <root> <data> 这是一些示例数据,它被保存在一个XML文件中,并被JavaScript取回。 </data> </root>

现在让我们创建一个简单的web页面包含一些示例数据。这个页面将是我们的js脚本所在,并且这个页面将会让用户们访问柄看到Ajax脚本的运行。我们把它命名为ajax.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="zh" dir="ltr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>使用ajax开发web应用程序 - 示例</title>
  </head>
  <body>
    <h1>使用ajax开发web应用程序</h1>
    <p>这个页面演示了AJAX技术如何通过动态读取一个远程文件来更新一个网页的内容--不需要任何网页的重新加载。注意:这个例子对于禁止js的用户来说没有效果。</p>
    <p id="xmlObj">
    这是一些示例数据,它是这个网页的默认数据 <a href="data.xml"
    title="查看这个XML数据." onclick="ajaxRead('data.xml'); this.style.display='none'; return false">查看XML数据.</a>
    </p>
  </body>
</html>

注意,对于那些没有javascript的用户,我们直接链接到data.xml文件。对于那些允许运行javascript的用户,函数“ajaxRead”将被运行,这个链接被隐藏,并不会被转向到那个data.xml文件。函数“ajaxRead”现在还没定义。所以如果你要检验上面的示例代码,你会得到一个javascript错误。让我们继续并定义这个函数(还有其他的),让你能够看到ajax是如何工作的,下面的脚本要放到你的head标签里:

<script type="text/javascript"><!--
function ajaxRead(file){
  var xmlObj = null;
  if(window.XMLHttpRequest){
      xmlObj = new XMLHttpRequest();
  } else if(window.ActiveXObject){
      xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
      return;
  }
  xmlObj.onreadystatechange = function(){
    if(xmlObj.readyState == 4){
       updateObj('xmlObj', xmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);
     }
    }
    xmlObj.open ('GET', file, true);
    xmlObj.send ('');
  }
  function updateObj(obj, data){
   document.getElementById(obj).firstChild.data = data;
  }
  //--></script>

(Sheneyan注:完整代码示例见 example.html ML文件见:data.xml )

这堆代码有点多,让我们一点点的进行。第一个函数叫做“ajaxRead”-也就是我们在页面的“查看XML数据”链接中调用的函数,我们定义了一个“xmlObj”变量-这将作为客户端(用户正在查看的这个web页面)以及服务端(web站点本身)之间的中间件。我们在一个if/else块中定义这个对象:

if(window.XMLHttpRequest){
   xmlObj = new XMLHttpRequest();
} else if(window.ActiveXObject){
   xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
} else {
   return;
}

这只是一个对不同对象是否可用的测试-某些浏览器实现了不同的XMLHttpRequest对象,所以当我们定义“xmlObj”作为我们的XMLHttpRequest对象时,我们不得不根据浏览器所实现的来定义它。如果没有可用的XMLHttpRequest对象,我们将执行“return”语句结束这个函数以避免脚本错误。在大部分情况下,这个检验将返回一个XMLHttpRequest对象-这部分代码应该能够在绝大部分的浏览器上工作,除了少部分比较老的浏览器的异常情况(它能够工作在ie5.01上,但是在netscape4上会使函数终止)。

接下来是这些代码块:

xmlObj.onreadystatechange = function(){
  if(xmlObj.readyState == 4){
      updateObj('xmlObj', xmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);
  }
}

每次XMLHttpRequest的状态发生变化,事件“onreadystatechange”就会被触发。通过使用“xmlObj.onreadystatechange = function(){...}”我们能够创建一个函数并让它在这个XMLHttpRequest对象的状态每次发生改变的时候立刻运行。这里总共有五个状态,由0走到4。

0 – 尚未初始化(在这个XMLHttpRequest开始前)

1 – 加载(XMLHttpRequest初始化一结束)

2 – 加载结束(XMLHttpRequest一从服务器上获得一个回应)

3 – 交互(当XMLHttpRequest对象和服务器连接中)

4 – 结束(当XMLHttpRequest被告知它已经完成了所有人物并结束运行)

这第五个状态(数字4)就是我们能够确定数据已经可用的标志,所以我们检验这个xmlObj.readyState是否等于“4”来确定数据是否可用,如果是4,我们运行updateObj函数。这个函数带两个参数:一个当前web页面的元素ID(当前web页面中要更新的元素)以及用于填充这个元素的数据。这个函数的运行方式在稍后将更详细地解释。

我们的web页面的p元素有一个id“xmlData”,这就是我们准备更新的段落。我们正在取得的数据来自于XML文件,但它有点复杂。这里是它如何工作的原理。

xmlObj.responseXML属性是一个DOM对象 - 它很象“document”对象,除了它来自远程的XML文件。换句话说,如果你在data.xml中运行脚本,那xmlObj.responseXML就是一个“document”对象。因为我们知道这些,我们能够通过“getElementsByTagName”方法取得任何XML节点。数据包含在一个命名为“<data>”的XML节点中,所以我们的任务很简单:取得第一个(而且只有这一个)数据节点。因而,xmlObject.responseXML.getElementsByTagName("data")[0]返回XML文件中的第一个<data>节点。
注意:它返回的是XML节点,而不是节点中的数据-这个数据必须通过访问XML节点的属性取得,这就是下一步要说的。

接下来,取得数据只需要简单的指定“firstChild.data”(firstChild指向了那个被<data>节点包含的文本节点,而这个“data”属性则是这个文本节点的实际文本)。

xmlObj.open ('GET', file, true);
xmlObj.send ('');

这是我们的ajaxRead函数的最后一个部分。它说了些什么?嗯,xmlObj的这个“open”方法打开了一个到服务器(通过一个指定的协议,这里指定的是“GET”-你可以使用“USE”或者其他别的协议)的连接,去请求一个文件(在我们的例子里,变量“file”被作为一个参数赋给ajaxRead函数-data.xml),而且javascript可以同步(false)或者异步(true,默认值)的处理请求。由于这是异步的Javascript和XML(AJAX),我们将使用默认的异步方式-在这个例子中,使用同步方式将不起作用。

这是我们函数中的最后一行,它简单的发送一个空字符串回服务器。如果没有这行,xmlObj的readyState永远不会到4,所以你的页面永远不会更新。这个send方法能够用于作其他事情,但今天我只是用来从服务器上取得数据-并不发送它-所以在这篇文章中我不准备介入任何关于send方法的细节。

function updateObj(obj, data){
  document.getElementById(obj).firstChild.data = data;
}

现在再稍微解释一下updateObj函数:这个函数使用一个新的值来更新当前页面上任何指定的元素。他的第一个参数,“obj”是当前页面中元素的ID-那个要被更新的对象;它的第二个参数,“data”是用来将那个将被替换值的对象(“obj”)的内容替换掉。一般来说,检验一下并确定当前页面上确实有一个元素的ID是“obj”是比较明智的,但对我们的脚本的这个隔离级别来说校验并不必要。这个函数更新的方式和我们之前从XML文件的“data”节点取得数据的方式类似-它定位它要更新的元素(这时候这个元素的ID代替了它的标签名和在页面中的索引)并设置这个元素的第一个子节点(文本节点)的data属性为新的值。如果你需要使用HTML而不是纯文本来更新一个元素,你也可以使用

document.getElementById(obj).innerHTML = data

这就是全部了

这个概念很简单,而且代码也不是很难。你能够从某个地方读取一个文件并且不需要重新加载这个web页面。你有足够的灵活性来作各种事情,包括从表单发送数据(不需要重新加载web页面)并且使用一个服务端语言来动态生成XML文件。如果你需要更近一步,记得这个连接是很有用的-哦,还要记得Google是你朋友。在另外的文章中,我将解释你如何配合服务端技术使用AJAX来构造强大的web应用程序。

关于作者

Jonathan Fenocchi(mail:jona#slightlyremarkable.com #换成@)是一个网络开发者,主攻web设计,客户端脚本,php脚本。
他的网站位于:http://www.slightlyremarkable.com

出处:蓝色理想
责任编辑:moby

上一页 下一页 如何使用ajax开发web应用程序 [2]

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
用MVC模型引导你的WEB设计思路
AJAX开发简略
基于 Ajax 的无限级菜单
基于Ajax的应用程序架构汇总
web关联菜单实现方法
作者文章
XHTML+CSS创建“两步式”的相册
全网 本站 论坛
热门搜索:CSS Fireworks 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
利用SqlDataAdapter进行分页
超15000个图层Photoshop作品
MDM zinc 入门
用户不上你的网站的50个原因
FSO操作文件系统
Fireworks 笔触特效
亚马逊网站导航栏的变迁史
PS人物绘制技法及实例讲解
《物志》封面设计欣赏
中文字体设计
栏目最新 栏目最新列表
利用SqlDataAdapter进行分页
MDM zinc 入门
用户不上你的网站的50个原因
FSO操作文件系统
Fireworks 笔触特效
掌握 Ajax
ObjectDataSourc控件
解决IE更新对FLASH产生影响
attachMovie外部swf中的元素
flash通过外部文本动态载图片
>> 分页 首页 前页 后页 尾页 页次:1/31个记录/页 转到 页 共3个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

本文总共有 7 条评论,现在显示最新的 5 条。评分:- llllllllllllllllllll + 评分人数: 1 ,平均分: 5.00


nece001 Publish at 2006-4-20 17:29:20
xmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data
这个好象有问题,取不到东西?????
nece001 Publish at 2006-4-20 17:27:16
我把例子弄下来,在我的机器上也是不行
Onlyfu Publish at 2006-3-11 20:57:34
貌似不行
老孤 Publish at 2006-2-8 18:29:09 评分5
禁止 JS 的客户端太少了。。。好经典的文章
leady27 Publish at 2006-2-8 15:51:27
ajax技术对于禁止JS的用户是行不通的。

查看全部评论

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
《Flash第一步系列》
《交互设计之路》
《Dreamweaver 从基础到实践》
《色彩管理》
《网页设计专家门诊》
《职业之道》设计师的技能书
《Flash MX 2004网站开发精粹》