如何使用ajax开发web应用程序(1)

如何使用ajax开发web应用程序(1)

作者: Jonathan Fenocchi

译者:Sheneyan(子乌)

时间:2005.10.25

英文原文:http://webreference.com/programming/javascript/jf/column12/index.html外链

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

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

Language:xml, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3.   <data>
  4.     这是一些示例数据,它被保存在一个XML文件中,并被JavaScript取回。
  5.   </data>
  6. </root>
  7.  

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

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

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

Language:javascript, parsed in: 0.030 seconds, using GeSHi 1.0.7.12
  1. <script type= "text/javascript">
  2. <!--
  3. function ajaxRead (file ){
  4.   var xmlObj = null;
  5.   if (window. XMLHttpRequest ){
  6.       xmlObj = new XMLHttpRequest ();
  7.   } else if (window. ActiveXObject ){
  8.       xmlObj = new ActiveXObject ( "Microsoft.XMLHTTP" );
  9.   } else {
  10.       return;
  11.   }
  12.   xmlObj. onreadystatechange = function (){
  13.     if (xmlObj. readyState == 4 ){
  14.        updateObj ( 'xmlObj', xmlObj. responseXML. getElementsByTagName ( 'data' )[ 0 ]. firstChild. data );
  15.       }
  16.     }
  17.     xmlObj. open ( 'GET', file, true );
  18.     xmlObj. send ( '' );
  19.   }
  20.   function updateObj (obj, data ){
  21.    document. getElementById (obj ). firstChild. data = data;
  22.   }
  23.   //-->
  24.  </script>
  25.  

(Sheneyan注:完整代码示例见example.html外链,XML文件见:data.xml外链

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

Language:javascript, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
  1. if (window. XMLHttpRequest ){
  2.    xmlObj = new XMLHttpRequest ();
  3. } else if (window. ActiveXObject ){
  4.    xmlObj = new ActiveXObject ( "Microsoft.XMLHTTP" );
  5. } else {
  6.     return;
  7. }
  8.  

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

  接下来是这些代码块:

Language:javascript, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
  1. xmlObj. onreadystatechange = function (){
  2.   if (xmlObj. readyState == 4 ){
  3.       updateObj ( 'xmlObj', xmlObj. responseXML. getElementsByTagName ( 'data' )[ 0 ]. firstChild. data );
  4.   }
  5. }
  6.  

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

  1. 尚未初始化(在这个XMLHttpRequest开始前)
  2. 加载(XMLHttpRequest初始化一结束)
  3. 加载结束(XMLHttpRequest一从服务器上获得一个回应)
  4. 交互(当XMLHttpRequest对象和服务器连接中)
  5. 结束(当XMLHttpRequest被告知它已经完成了所有人物并结束运行)

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

  我们的web页面的p元素有一个idxmlData,这就是我们准备更新的段落。我们正在取得的数据来自于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-你可以使用POST或者其他别的协议)的连接,去请求一个文件(在我们的例子里,变量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应用程序。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值