如何使用Ajax技术开发Web应用程序(3)

zhunchihya

zhunchihya

2016-02-19 22:32

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的如何使用Ajax技术开发Web应用程序(3),手机电脑控们准备好了吗?一起看过来吧!

新增加的内容,首先是两个新变量的声明:“subAry”和“subAryLen”。它们和之前的变量“dataArray”和“dataArrayLen”类似,除了它们指向不同的数组(特别是它们将指向那些“task”元素-当“dataArray”和“dataArrayLen”指向“pet”元素的时候)。

我们也改变了变量“insertData”的初始值-我们增加了一个表格头(<th )给我们的“tasks”字段。

下一步改变在于循环:我们把值赋给subAry和subAryLen变量。变量subAry成为当前<pet 的<task 元素的数组。变量subAryLen成为这个数组的长度,直到这个数组发生变化(当外部循环走到下一个<pet 时)。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

我们创建了一个内嵌的循环来处理所有的<task 元素,一次一个。大概来说,我们创建一个新的数据格,放进一个用逗号分隔的任务列表,然后关闭数据表格以及当前行。尤其,这些<task 元素节点数据(任务本身,比如,“喂食”)放置入变量“insertData”里的数据格。

接下来,我们检验当前<pet 是否有其它更多的task。如果还有,我们增加一个逗号(,)到变量insertData来让每一个任务使用一个逗号分隔(“a, b, c”,而不是“a, b, c,”-注意,最后一个逗号在第二个任务那里,所以我们不需要)。这个工作在我们取得subAry数组长度的时候(给循环的“j”变量加1)就完成了。因为这个循环会在下一个循环的时候把变量“j”递增1,“j”会比它这次检验时还多1。因此,如果“j+1”(或者,“当循环再次开始的时候j的值”)等于subAryLen(当前<pet 节点的<task 节点数目),这个循环将停止。如果循环不再运行,我们就不再添加新的逗号来分隔任务。所以如果“j+1”不等于subAryLen,我们直到我们可以安全的加入逗号到“insertData”,为下一个<task 作准备。

一旦内循环结束,我们关闭task数据格以及pet行。外部循环会重新开始创建一个新行以及移动到下一个<pet 。这个处理一直进行到所有的<pet 元素(以及每一个pet的所有<task 元素)都被处理完。

有其他方法吗?

你也许会想:“那javascript变得相当复杂了,但它只会随着XML越来越复杂而跟着变复杂,也许我们能够简化XML,然后,简化javascript”。如果你这么想,很棒,因为你完全正确。我之前展示的不同方法之一,我详细说明的那个也许能够成为最合适的。我们怎么使用属性来对应每一只宠物以及相应任务?XML看起来会变成怎样?

<?xml version="1.0" encoding="UTF-8"?
<data
<pets
<pet type="Cat" tasks="Feed, Water, Comb out fleas" /
<pet type="Dog" tasks="Feed, Water, Put outside" /
<pet type="Fish" tasks="Feed, Check oxygen, water purity, etc." /
</pets
</data

哇哦!看起来简单多了。让我们看看我们的processXML函数如何修改:

function processXML(obj){
var dataArray = obj.getElementsByTagName('pet');
var dataArrayLen = dataArray.length;
var insertData = '<table <tr <th '
+ 'Pets</th <th Tasks</th </tr ';
for (var i=0; i<dataArrayLen; i++){
insertData += '<tr <td ' + dataArray[i].getAttribute('type') + '</td '
+ '<td ' + dataArray[i].getAttribute('tasks') + '</td </tr ';
}
insertData += '</table ';
document.getElementById ('dataArea').innerHTML = insertData;
}

(Sheneyan注:修改后的示例见:附件: example_2_4.htm ,XML文件见:附件: data_2_4.xml )

就像你猜的一样,函数简单多了。因为代码变得简单,它也会变得更有效率。和我们比较老的函数的唯一的不同在于这个变量insertData现在插入更多的HTML,尤其是两个新变量“type”和“tasks”。就如我们较早之前所学的,那些属性是我们从XML文档的<pet 元素中取得的,而且每个pet的属性都有不同的值。对于你自己修改这个XML文件以适应你的进度的变动来说也许是最简单的方法。例如,如果你最终把你的猫身上的跳蚤抓光了,你只要简单从你的猫的每日任务表中把“减少跳蚤数量”删除,然而在之前我们使用的XML中,实现起来也许会觉得糊里糊涂。

最后的XML格式化的方法是将两部分混合。现在,我们将使用属性和不同的标签。让我们看一下示例XML:

<?xml version="1.0" encoding="UTF-8"?
<data
<pets
<猫 tasks="喂食, 饮水, 减少跳蚤数量" /
<狗 tasks="喂食, 饮水, 带出去遛遛" /
<鱼 tasks="喂食, 检查氧气,水的纯度,其它" /
</pets
</data

这也许是最便于理解的XML。让我们分析一下我们为了让processXML函数运作起来所作的变更:

function processXML(obj){
var dataArray = obj.getElementsByTagName('pets')[0].childNodes;
var dataArrayLen = dataArray.length;
var insertData = '<table <tr <th '
+ 'Pets</th <th Tasks</th </tr ';
for (var i=0; i<dataArrayLen; i++){
if(dataArray[i].tagName){
insertData += '<tr <td ' + dataArray[i].tagName + '</td '
+ '<td ' + dataArray[i].getAttribute('tasks') + '</td </tr ';
}
}
insertData += '</table ';
document.getElementById ('dataArea').innerHTML = insertData;
}

(Sheneyan注:修改后的示例见:附件: example_2_5.htm ,XML文件见:附件: data_2_5.xml )

“dataArray”现在指向了<pets 的子节点,将它们作为一个数组对待(换句话说,dataArray现在是在<pets 节点内所有节点的数组)。这事因为每一个标签都不同(<猫 / ,<狗 / ,<鱼 / ),所以我们不能使用这些元素的名称来搜索它们(而之前我们可以使用<pet ,因为所有的元素都是<pet )。

还是一样,每个节点之间的有空格,所以在我们的处理过程中得排除掉文本节点。我们能够检验标签名是否存在-文本节点是节点但没有标签,而<猫 / ,<狗 / ,<鱼 / 节点都是标签。所以如果一个标签有名字,那我们能够将数据插入变量insertData。我们插入的数据是一个表格并有两个表格数据格。这第一个单元格是标签名,也就是宠物的类型(猫,狗或鱼),而第二个单元格则是指定动物的“tasks”属性值(比如“喂食或饮水”)。

结束语

在这篇文章里,我演示了这个例子的很多变化,你可以随意试验它们来检验哪个更适合你。只要记住一点,XML是“可扩展的”,所以没有“错误的”方法来组合你的数据,虽然经常有一个“最好的”方法。而且,要注意让你的XML保持格式良好。记住很多问题来自于忘记结束一个标签(比如<狗 / 而不是<狗 ;除非这个节点中有数据,比如下面的<狗 这里有数据哦</狗 )。

我意图使XML和javascript的应用不糊涂而变得明朗。一步步的学习处理更多的数据,你能够将ajax运用于更大的用途。我希望看到ajax更多的应用于企业网站,及其它。所以如果你将这些知识应用于实践,我很高兴了解到你学到了什么(mail:jona#slightlyremarkable.com #换成@)。
在这个关于AJAX系列的第三部分中,我们将学习如何使用AJAX与服务端进行写作以及这些技术如何产生强大的web应用程序。如果你对学习如何构建类似GMail或者Google Maps的web程序感兴趣的话,这是一篇基础的入门(虽然那两个东东会比我们在这篇文章中提及的内容复杂的多)。在这篇文章中,我使用PHP作为服务端语言,但AJAX能够和任何服务端语言进行很好的兼容,所以你尽可以选择你所钟爱的任何语言!

我们还是从我们上一篇文章的代码(喏,就在上面)开始我们的学习,你可以去阅读它来作为参考。

这里就是这个HTML页面(带js):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"
<html lang="zh-cn" dir="ltr"
<head
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
<title 如何使用ajax开发web应用程序--示例</title
<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){
processXML(xmlObj.responseXML);
}
}
xmlObj.open ('GET', file, true);
xmlObj.send ('');
}
function processXML(obj){
var dataArray = obj.getElementsByTagName('pets')[0].childNodes;
var dataArrayLen = dataArray.length;
var insertData = '<table <tr <th '
+ 'Pets</th <th Tasks</th </tr ';
for (var i=0; i<dataArrayLen; i++){
if(dataArray[i].tagName){
insertData += '<tr <td ' + dataArray[i].tagName + '</td '
+ '<td ' + dataArray[i].getAttribute('tasks') + '</td </tr ';
}
}
insertData += '</table ';
document.getElementById ('dataArea').innerHTML = insertData;
}
//-- </script
<style type="text/css" <!--
table, tr, th, td {
border: solid 1px #000;
border-collapse: collapse;
padding: 5px;
}
-- </style
</head
<body

<h1 使用Ajax开发web应用程序</h1
<p 这个页面演示了AJAX技术如何通过动态读取一个远程文件来更新一个网页的内容--不需要任何网页的重新加载。注意:这个例子对于禁止js的用户来说没有效果。</p
<p 这个页面将演示如从取回并处理成组的XML数据。被取回的数据将会以表格形式输出到底下。
<a href="#" onclick="ajaxRead('data_3.php'); return false" 查看演示</a .</p
<div id="dataArea" </div
</body
</html

注意:这里唯一的变化就是我们将我们的ajaxRead()中的“data_2.xml”改成了“data_3.php”。这是因为我们将使用php来输出XML(如果你在你的浏览器里打开这个PHP文件,它会以一个XML文件的形式展现出来--我们只是要在这个文件中进行操作而不只是一个简单的XML)。这个PHP文件的输出类似:

<?xml version="1.0" encoding="UTF-8"?
<data
<pets
<猫 tasks="喂食, 饮水, 抓跳蚤" /
<狗 tasks="喂食, 饮水, 带出去遛遛" /
<鱼 tasks="喂食, 检查氧气,水的纯度,其它" /
</pets
</data
(Sheneyan注:示例就不提供了,参考底下说明即可。)

这只是输出结果,我们准备从一个mysql数据库中获取这些信息。从现在起,我们可以直接在我们的数据库中修改数据而不是手动修改XML文件。用AJAX通过PHP来取得数据,并将它获取到一个页面上--所有这些,仍然不需要重新加载网页。

第一步是连接到mysql去获取数据。这篇文章的重点在javascript,所以我不会解释下面的代码如何工作,你需要自己去了解如何连接mysql数据库。

<?php
user = "admin";
pass = "adminpass";
host = "localhost";
conn = mysql_connect(host, user, pass) or die("Unable to connect to MySQL.");
db = mysql_select_db("pets",conn) or die("Could not select the database.");
mysql_close(db);

只要你连接了数据库,你可以通过底下的查询来获取信息:

<?php
user = "admin";
pass = "adminpass";
host = "localhost";
conn = mysql_connect(host, user, pass) or die("Unable to connect to MySQL.");
db = mysql_select_db("pets",conn) or die("Could not select the database.");
result = mysql_query("SELECT * FROM `pets`");
if(mysql_num_rows (result) == 0){
die ('Error: no data found in the database.');
}
while (row = mysql_fetch_assoc(result)){
echo 'Pet: '.row['pet'].', tasks: '.row['tasks'].'. ';
}
mysql_close(db);

这段代码给了你需要的信息,但它输出并不正确。我们需要修改这PHP代码来分隔数据为XML,而不是纯文本。为了实现这个目标我们得作几个修改。

<?php
header('Content-Type: text/xml');//编号1
echo '<?xml version="1.0" encoding="UTF-8"? ';//编号2
echo "n<data n<pets n";//编号3
user = "admin";
pass = "adminpass";
host = "localhost";
conn = mysql_connect(host, user, pass) or die("无法连接mysql.");
db = mysql_select_db("pets",conn) or die("无法选择数据库.");
result = mysql_query("SELECT * FROM `pets`");
if(mysql_num_rows (result) == 0){
die ('Error: 数据库没有数据.');
}
while (row = mysql_fetch_assoc(result)){
echo '<'.row['pet'].' tasks="'.row['tasks'].'" / '."n";//编号4
}
echo "</pets n</data ";//编号5
mysql_close(db);

让我们从上面开始,一次一行的来分析它是如何输出XML的.我给每一行都加了注释标记以便于更好的对应理解(原文是I've color-coded each line to make it easier to understand,我懒得上色,就改成用编号了)

编号1:这部分代码发送一个http头来让用户客户端明白这个php文件输出的是一个XML。这就是为什么你在你的浏览器里看这个文档的时候它以一个XML文件的形式展现,即使你的文件有一个“.php”后缀。

编号2:这部分的代码输出了XML声明。这是我之前展示给你看的XML的第一行。

编号3:这部分的代码输出的最开始的两个标签:我们的根标签,<data 和我们用来放置所有宠物的<pets 标签。

编号4:这部分的代码最困难的。这里包含了一个循环用来遍历你数据库里所有的数据。每次循环,它会输出一个新的节点,这个节点用每一种动物作为标签名以及一个"任务"属性。例如,如果你数据库中的第一只宠物是“猫”而且它相应的任务字段是“喂食, 饮水, 抓跳蚤”,那php将输出在XML文档中输出 <猫 tasks="喂食, 饮水, 抓跳蚤" / 。这个“n” 部分只是在结尾插入一个新行,保证这个XML代码不至于都在同一行。

编号5:这部分的代码结束了 我们开始时打开的</pets 和 </data 节点。因为XML必须是格式良好的(well-formed),所以我们必须认真对待这部分以确认我们的程序能够正确运行。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

现在我们已经让PHP输出XML了,我们现在所要作的就是登录我们的mysql数据库,并进行我们所需要的修改,来更新这个XML。很酷,不是吗?我们仍然能够使用上一篇文章中的js脚本来获取代码,因为XML输出和之前的完全一样。

结论

你可以再进一步的扩展,使用XML来保存和获取数据。换句话说,你能够使用php来写你的XML文件,然后让javascript来读。用ajax,你也能够定时的检查xml文件是否已经更改而且,如果XML已经更新,也可以更新本页面。

展开更多 50%)
分享

猜你喜欢

如何使用Ajax技术开发Web应用程序(3)

Web开发
如何使用Ajax技术开发Web应用程序(3)

如何使用Ajax技术开发Web应用程序(3)

Web开发
如何使用Ajax技术开发Web应用程序(3)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何使用Ajax技术开发Web应用程序(1)

Web开发
如何使用Ajax技术开发Web应用程序(1)

如何使用Ajax技术开发Web应用程序(2)

Web开发
如何使用Ajax技术开发Web应用程序(2)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

利用AJAX技术开发应用程序实战

Web开发
利用AJAX技术开发应用程序实战

如何使用Ajax开发Web应用程序

Web开发
如何使用Ajax开发Web应用程序

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

AJAX中JavaScript支持面向对象的基础

AJAX中JavaScript支持面向对象的基础

ajax代理程序自动判断字符编码

ajax代理程序自动判断字符编码
下拉加载更多内容 ↓