如何使用Ajax技术开发Web应用程序(1).doc_第1页
如何使用Ajax技术开发Web应用程序(1).doc_第2页
如何使用Ajax技术开发Web应用程序(1).doc_第3页
如何使用Ajax技术开发Web应用程序(1).doc_第4页
如何使用Ajax技术开发Web应用程序(1).doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在过去,由于为了获得新数据而不得不重新加载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文件中,并被JavaScript取回。 现在让我们创建一个简单的web页面包含一些示例数据。这个页面将是我们的js脚本所在,并且这个页面将会让用户们访问柄看到Ajax脚本的运行。我们把它命名为ajax.html 使用ajax开发web应用程序 - 示例 使用ajax开发web应用程序 这个页面演示了AJAX技术如何通过动态读取一个远程文件来更新一个网页的内容不需要任何网页的重新加载。注意:这个例子对于禁止js的用户来说没有效果。 这是一些示例数据,它是这个网页的默认数据 查看XML数据. 注意,对于那些没有javascript的用户,我们直接链接到data.xml文件。对于那些允许运行javascript的用户,函数“ajaxRead”将被运行,这个链接被隐藏,并不会被转向到那个data.xml文件。函数“ajaxRead”现在还没定义。所以如果你要检验上面的示例代码,你会得到一个javascript错误。让我们继续并定义这个函数(还有其他的),让你能够看到ajax是如何工作的,下面的脚本要放到你的head标签里:这堆代码有点多,让我们一点点的进行。第一个函数叫做“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节点。数据包含在一个命名为“”的XML节点中,所以我们的任务很简单:取得第一个(而且只有这一个)数据节点。因而,xmlObject.responseXML.getElementsByTagName(data)0返回XML文件中的第一个节点。注意:它返回的是XML节点,而不是节点中的数据这个数据必须通过访问XML节点的属性取得,这就是下一步要说的。接下来,取得数据只需要简单的指定“firstChild.data”(firstChild指向了那个被节点包含的文本节点,而这个“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应用程序。发表于 2006年02月12日 5:10 PM | 评论 (0)如何使用Ajax技术开发Web应用程序(2)在上一篇文章中,我们讨论了如何通过javascript从一个远程XML文件中取得数据。在这篇文章中,我们将学会怎样对数据作更复杂的处理。作为一个示例,我们会准备一组XML数据,将数据分割成独立的片断并以不同的方式展示这些片断(取决于它们是如何被标识的)。这篇文章是建立在上一篇文章中构造的示例代码的基础之上,所以如果你不能理解我们现在的代码,你可以回过头去读第一篇文章(sheneyan注:就在上面)。开始让我们开始我们的第一步:构造XML。我们准备写一个XML文档,它组织了一系列准备让javascript处理的数据,所以我们将一起组织一些节点和子节点(或者,元素和子元素)。在这个例子里,我们将使用一些家庭宠物的名字: 猫 狗 鱼 在上面,我们有这个XML声明(标明这个文档是一个XML 1.0 文档,使用UTF-8编码),一个根元素()将下面所有的元素组合在一起,一个元素组织了所有的宠物,然后一个节点对应一只宠物。为了指定每一只宠物是什么类型的动物,我们在元素中设置了文本节点:猫,狗,鱼。 使用Ajax开发Web应用程序 - 示例 !- 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) processXML(xmlObj.responseXML); xmlObj.open (GET, file, true); xmlObj.send (); function processXML(obj) var dataArray = obj.getElementsByTagName(pet); var dataArrayLen = dataArray.length; var insertData = + Pets; for (var i=0; idataArrayLen; i+) insertData += + dataArrayi.firstChild.data + ; insertData += ; document.getElementById (dataArea).innerHTML = insertData; /- 使用Ajax开发web应用程序 这个页面演示了AJAX技术如何通过动态读取一个远程文件来更新一个网页的内容不需要任何网页的重新加载。注意:这个例子对于禁止js的用户来说没有效果。 这个页面将演示如从取回并处理成组的XML数据。被取回的数据将会以表格形式输出到底下。查看演示. 你会注意到我们和上次一样以同样的方式(通过一个超链接)调用了这个函数,而且我们将数据放入一个DIV(这次这个东东叫做“dataArea”)。这个ajaxRead()函数和上次很接近,除了一点不同:onreadystatechange函数。让我们先看一下这个函数:xmlObj.onreadystatechange = function() if(xmlObj.readyState = 4) processXML(xmlObj.responseXML); 我们取消了updateObj函数并用一个叫做processXML()的新函数来代替它。这个函数将得到XML文档本身(也就是被ajaxRead函数取回的)并处理它。(这“XML文档本身”我指的是参数“xmlObj.responseXML”)现在让我们分析一下这个函数processXML。下面是它的代码: function processXML(obj) var dataArray = obj.getElementsByTagName(pet); var dataArrayLen = dataArray.length; var insertData = + Pets; for (var i=0; idataArrayLen; i+) insertData += + dataArrayi.firstChild.data + ; insertData += ; document.getElementById (dataArea).innerHTML = insertData; 首先,我们定义了一些变量。“dataArray”作为所有节点的数组(不是节点数据,只是节点)。“dataArrayLen”是这个数组的长度,用于我们的循环。“insertData”则是一个表格的开头的HTML。我们的第二步则是遍历所有的元素(通过变量“dataArray”)并将数据添加到变量insertData中。这里我们会创建一个表格行,插入一个表格数据节点(td)进去,再将每一个元素的文本包含进这个表格数据节点,并将这些都添加进变量“insertData”。因此,每循环一次,变量insertData将添加一行包含三个宠物中之一名称的新数据。新数据行添加完后,我们插入一个“”结束标签到变量“insertData”。这完成了这个表格,然后我只剩这最后一步来达成我们的目标:我们需要将这个表格放到页面上。幸运的是,我们得感谢innerHTML属性,这很简单。我们通过函数document.getElementById()取得DIV“dataArea”并将变量“insertData”中的HTML插进去。嗯,这个表格冒出来了!我们继续之前我得指出两点:首先,你会注意到我们并没有使用节点。这事因为我们只有一个数据组()以及后来所有的元素(每一个元素);这些子节点包含了不同的数据但它们有相同的名字。在这个例子中,这个节点能够被忽略。然而,将所有的元素放进元素还是比较好,而不是让这些元素自己散放(但仍然在data元素里面)。另外一种方式是给每一个宠物放一个指定的标签,比如: 然后我们能够遍历元素里的节点。这个processXML函数看起来就像这样: function processXML(obj) var dataArray = obj.getElementsByTagName(pets)0.childNodes; var dataArrayLen = dataArray.length; var insertData = + Pets; for (var i=0; idataArrayLen; i+) if(dataArrayi.tagName) insertData += + dataArrayi.tagName + ; insertData += ; document.getElementById (dataArea).innerHTML = insertData; 这里所作的修改就是我们指向了组元素(这个“0”意味这是第一个,即使它就是唯一的那一个)以及它的子节点(元素,)。因为文本元素分割了这几个元素(空格被认为是一个节点),我们需要确定只有那些有标签名的节点(嗯,也就是只有标签)通过。然后我们输出每一个标签的名字。因为每一个标签名是一个宠物,我们不需要取得每一个节点的数据节点名本身已经足够。去看一下它是怎么工作的吧。还有另外一种方式来完成我们上面的工作,就是给每一个节点设置一个属性值。你的XML文档看起来就像这样: 你只需要稍微修改一下你的processXML函数,它变成这样子了: function processXML(obj) var dataArray = obj.getElementsByTagName(pet); var dataArrayLen = dataArray.length; var insertData = + Pets; for (var i=0; idataArrayLen; i+) insertData += + dataArrayi.getAttribute(type) + ; insertData += ; document.getElementById (dataArea).innerHTML = insertData; (Sheneyan注:修改后的示例见:example_2_2.html ,XML文件见:data_2_2.xml)关键的不同在于我们通过dataArrayi.getAttribute(type)取得值,它返回了当前节点的“type”属性的值。继续.现在我们已经知道了一些从一个单独的XML数据组中取回数据的有效方法,让我们看看如何从多个组中取回数据。和只是列出一个pets所拥有的内容不同,我们假设我们有一个针对我们宠物的日课表。因为它们都有不同的需要,每一只宠物都得仔细的照顾。面对这种情况,动物的看管员需要一个每日依据。现在来让我们将这些放入一个良好格式的XML: Cat Feed Water Comb out fleas Dog Feed Water Put outside Fish Feed Check oxygen, water purity, etc. 也许这个看起来很奇怪,但这就是我们正在创建的子组(sub-group)。每一个元素都是一个组的子组,而每一个则是每一个组的子元素。在我继续之前,你也许希望将你的表格用一些css美化一下,比如: 这让这个表格更容易读取。现在让我们去研究函数processXML: function processXML(obj) var dataArray = obj.getElementsByTagName(pet); var dataArrayLen = dataArray.length; var subAry, subAryLen; var insertData = + PetsTasks; for (var i=0; idataArrayLen; i+) insertData += + dataArrayi.firstChild.data + ; subAry = dataArrayi.getElementsByTagName(task); subAryLen = subAry.length; insertData += ; for(var j=0; jsubAryLen; j+) insertData += subAryj.firstChild.data; if( subAryLen != j+1 ) insertData += , ; insertData += ; insertData += ; document.getElementById (dataArea).innerHTML = insertData;新增加的内容,首先是两个新变量的声明:“subAry”和“subAryLen”。它们和之前的变量“dataArray”和“dataArrayLen”类似,除了它们指向不同的数组(特别是它们将指向那些“task”元素当“dataArray”和“dataArrayLen”指向“pet”元素的时候)。我们也改变了变量“insertData”的初始值我们增加了一个表格头()给我们的“tasks”字段。下一步改变在于循环:我们把值赋给subAry和subAryLen变量。变量subAry成为当前的元素的数组。变量subAryLen成为这个数组的长度,直到这个数组发生变化(当外部循环走到下一个时)。我们创建了一个内嵌的循环来处理所有的元素,一次一个。大概来说,我们创建一个新的数据格,放进一个用逗号分隔的任务列表,然后关闭数据表格以及当前行。尤其,这些元素节点数据(任务本身,比如,“喂食”)放置入变量“insertData”里的数据格。接下来,我们检验当前是否有其它更多的task。如果还有,我们增加一个逗号(,)到变量insertData来让每一个任务使用一个逗号分隔(“a, b, c”,而不是“a, b, c,”注意,最后一个逗号在第二个任务那里,所以我们不需要)。这个工作在我们取得subAry数组长度的时候(给循环的“j”变量加1)就完成了。因为这个循环会在下一个循环的时候把变量“j”递增1,“j”会比它这次检验时还多1。因此,如果“j+1”(或者,“当循环再次开始的时候j的值”)等于subAryLen(当前节点的节点数目),这个循环将停止。如果循环不再运行,我们就不再添加新的逗号来分隔任务。所以如果“j+1”不等于subAryLen,我们直到我们可以安全的加入逗号到“insertData”,为下一个作准备。一旦内循环结束,我们关闭task数据格以及pet行。外部循环会重新开始创建一个新行以及移动到下一个。这个处理一直进行到所有的元素(以及每一个pet的所有元素)都被处理完。有其他方法吗?你也许会想:“那javascript变得相当复杂了,但它只会随着XML越来越复杂而跟着变复杂,也许我们能够简化XML,然后,简化javascript”。如果你这么想,很棒,因为你完全正确。我之前展示的不同方法之一,我详细说明的那个也许能够成为最合适的。我们怎么使用属性来对应每一只宠物以及相应任务?XML看起来会变成怎样? 哇哦!看起来简单多了。让我们看看我们的processXML函数如何修改: function processXML(obj) var dataArray = obj.getElementsByTagName(pet); var dataArrayLen = dataArray.length; var insertData = + PetsTasks; for (var i=0; idataArrayLen; i+) insertData += + dataArrayi.getAttribute(type) + + + dataArrayi.getAttribute(tasks) + ; insertData += ; document.getElementById (dataArea).innerHTML = insertData;(Sheneyan注:修改后的示例见:example_2_4.html,XML文件见:data_2_4.xml)就像你猜的一样,函数简单多了。因为代码变得

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论