一起草最新网址_日韩一区二区麻豆国产_91视频婷婷_日本一区二区视频在线_日韩激情一区二区三区_国产另类第一区_成人免费在线播放视频_亚洲永久精品ww.7491进入_久久这里有精品视频_久久精品一级片_日韩av在线网页_波多野结衣不卡视频

使用Ajax技術開發Web應用程序_AJAX教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:揭開AJAX神秘面紗
本文通過一個簡單的例子來說明如何在IE6中使用AJAX技術。在這例子中,客戶端每隔十秒,從服務器端取回一個隨機的字符串,在不重新刷新頁情況下,自動更新部分頁面內容。例子僅用到了兩個jsp文件,client.jsp及server.jsp。 AJAX,即Asynchronous JavaScript

在過去,由于為了獲得新數據而不得不重新加載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>

 

這堆代碼有點多,讓我們一點點的進行。第一個函數叫做“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應用程序。
在上一篇文章中,我們討論了如何通過javascript從一個遠程XML文件中取得數據。在這篇文章中,我們將學會怎樣對數據作更復雜的處理。作為一個示例,我們會準備一組XML數據,將數據分割成獨立的片斷并以不同的方式展示這些片斷(取決于它們是如何被標識的)。

這篇文章是建立在上一篇文章中構造的示例代碼的基礎之上,所以如果你不能理解我們現在的代碼,你可以回過頭去讀第一篇文章(sheneyan注:就在上面)。

開始~

讓我們開始我們的第一步:構造XML。我們準備寫一個XML文檔,它組織了一系列準備讓javascript處理的數據,所以我們將一起組織一些節點和子節點(或者,元素和子元素)。在這個例子里,我們將使用一些家庭寵物的名字:

 

<?xml version="1.0" encoding="UTF-8"?>
<data>
<pets>
<pet> 貓</pet>
<pet> 狗</pet>
<pet> 魚</pet>
</pets>
</data>

 

在上面,我們有這個XML聲明(標明這個文檔是一個XML 1.0 文檔,使用UTF-8編碼),一個根元素(<data> )將下面所有的元素組合在一起,一個<pets> 元素組織了所有的寵物,然后一個<pet> 節點對應一只寵物。為了指定每一只寵物是什么類型的動物,我們在<pet> 元素中設置了文本節點:貓,狗,魚。

 

<!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>
<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('pet');
var dataArrayLen = dataArray.length;
var insertData = '<table style="width:150px; border: solid 1px #000"> <tr> <th> '
+ 'Pets</th> </tr> ';
for (var i=0; i<dataArrayLen; i++){
insertData += '<tr> <td> ' + dataArray[i].firstChild.data + '</td> </tr> ';
}
insertData += '</table> ';
document.getElementById ('dataArea').innerHTML = insertData;
}
//--> </script>
</head>
<body>
<h1> 使用Ajax開發web應用程序</h1>
<p> 這個頁面演示了AJAX技術如何通過動態讀取一個遠程文件來更新一個網頁的內容--不需要任何網頁的重新加載。注意:這個例子對于禁止js的用戶來說沒有效果。</p>
<p> 這個頁面將演示如從取回并處理成組的XML數據。被取回的數據將會以表格形式輸出到底下。
<a href="#" onclick="ajaxRead('data_2.xml'); return false"> 查看演示</a> .</p>
<div id="dataArea"> </div>
</body>
</html>

 

你會注意到我們和上次一樣以同樣的方式(通過一個超鏈接)調用了這個函數,而且我們將數據放入一個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 = '<table style="width:150px; border: solid 1px #000"> <tr> <th> '
+ 'Pets</th> </tr> ';
for (var i=0; i<dataArrayLen; i++){
insertData += '<tr> <td> ' + dataArray[i].firstChild.data + '</td> </tr> ';
}
insertData += '</table> ';
document.getElementById ('dataArea').innerHTML = insertData;
}

 

首先,我們定義了一些變量。“dataArray”作為所有<pet> 節點的數組(不是節點數據,只是節點)。“dataArrayLen”是這個數組的長度,用于我們的循環。“insertData”則是一個表格的開頭的HTML。

我們的第二步則是遍歷所有的<pet> 元素(通過變量“dataArray”)并將數據添加到變量insertData中。這里我們會創建一個表格行,插入一個表格數據節點(td)進去,再將每一個<pet> 元素的文本包含進這個表格數據節點,并將這些都添加進變量“insertData”。因此,每循環一次,變量insertData將添加一行包含三個寵物中之一名稱的新數據。

新數據行添加完后,我們插入一個“</table> ”結束標簽到變量“insertData”。這完成了這個表格,然后我只剩這最后一步來達成我們的目標:我們需要將這個表格放到頁面上。幸運的是,我們得感謝innerHTML屬性,這很簡單。我們通過函數document.getElementById()取得DIV“dataArea”并將變量“insertData”中的HTML插進去。嗯,這個表格冒出來了!

我們繼續之前……

我得指出兩點:

首先,你會注意到我們并沒有使用節點<pets> 。這事因為我們只有一個數據組(<pets> )以及后來所有的元素(每一個<pet> 元素);這些子節點包含了不同的數據但它們有相同的名字。在這個例子中,這個節點能夠被忽略。然而,將所有的元素<pet> 放進<pets> 元素還是比較好,而不是讓這些<pet> 元素自己散放(但仍然在data元素里面)。

另外一種方式是給每一個寵物放一個指定的標簽,比如:

 

<?xml version="1.0" encoding="UTF-8"?>
<data>
<pets>
<貓 />
<狗 />
<魚 />
</pets>
</data>

 

然后我們能夠遍歷元素<pets> 里的節點。這個processXML函數看起來就像這樣:

 

function processXML(obj){
var dataArray = obj.getElementsByTagName('pets')[0].childNodes;
var dataArrayLen = dataArray.length;
var insertData = '<table style="width:150px; border: solid 1px #000"> <tr> <th> '
+ 'Pets</th> </tr> ';
for (var i=0; i<dataArrayLen; i++){
if(dataArray[i].tagName){
insertData += '<tr> <td> ' + dataArray[i].tagName + '</td> </tr> ';
}
}
insertData += '</table> ';
document.getElementById ('dataArea').innerHTML = insertData;
}

 

這里所作的修改就是我們指向了<pets> 組元素(這個“[0]”意味這是第一個,即使它就是唯一的那一個)以及它的子節點(元素<貓 /> ,<狗 /> ,<魚 /> )。因為文本元素分割了這幾個元素(空格被認為是一個節點),我們需要確定只有那些有標簽名的節點(嗯,也就是只有標簽)通過。然后我們輸出每一個標簽的名字。因為每一個標簽名是一個寵物,我們不需要取得每一個節點的數據-節點名本身已經足夠。去看一下它是怎么工作的吧。

還有另外一種方式來完成我們上面的工作,就是給每一個<pet> 節點設置一個屬性值。你的XML文檔看起來就像這樣:

 

<?xml version="1.0" encoding="UTF-8"?>
<data>
<pets>
<pet type="貓" />
<pet type="狗" />
<pet type="魚" />
</pets>
</data>

 

你只需要稍微修改一下你的processXML函數,它變成這樣子了:

 

function processXML(obj){
var dataArray = obj.getElementsByTagName('pet');
var dataArrayLen = dataArray.length;
var insertData = '<table style="width:150px; border: solid 1px #000"> <tr> <th> '
+ 'Pets</th> </tr> ';
for (var i=0; i<dataArrayLen; i++){
insertData += '<tr> <td> ' + dataArray[i].getAttribute('type') + '</td> </tr> ';
}
insertData += '</table> ';
document.getElementById ('dataArea').innerHTML = insertData;
}

 

(Sheneyan注:修改后的示例見:附件: example_2_2.htm ,XML文件見:附件: data_2_3.xml )

關鍵的不同在于我們通過dataArray[i].getAttribute('type')取得值,它返回了當前<pet> 節點的“type”屬性的值。

繼續...

現在我們已經知道了一些從一個單獨的XML數據組中取回數據的有效方法,讓我們看看如何從多個組中取回數據。和只是列出一個pets所擁有的內容不同,我們假設我們有一個針對我們寵物的日課表。因為它們都有不同的需要,每一只寵物都得仔細的照顧。面對這種情況,動物的看管員需要一個每日依據。現在來讓我們將這些放入一個良好格式的XML:

 

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

 

也許這個看起來很奇怪,但這就是我們正在創建的子組(sub-group)。每一個<pet> 元素都是一個組<pets> 的子組,而每一個<task> 則是每一個<pet> 組的子元素。

在我繼續之前,你也許希望將你的表格用一些css美化一下,比如:

 

<style type="text/css"> <!--
table, tr, th, td {
border: solid 1px #000;
border-collapse: collapse;
padding: 5px;
}
--> </style>

 

這讓這個表格更容易讀取。現在讓我們去研究函數processXML:

 

function processXML(obj){
var dataArray = obj.getElementsByTagName('pet');
var dataArrayLen = dataArray.length;
var subAry, subAryLen;
var insertData = '<table> <tr> <th> '
+ 'Pets</th> <th> Tasks</th> </tr> ';
for (var i=0; i<dataArrayLen; i++){
insertData += '<tr> <td> ' + dataArray[i].firstChild.data + '</td> ';
subAry = dataArray[i].getElementsByTagName('task');
subAryLen = subAry.length;
insertData += '<td> ';
for(var j=0; j<subAryLen; j++){
insertData += subAry[j].firstChild.data;
if( subAryLen != j+1 ) { insertData += ', '; }
}
insertData += '</td> </tr> ';
}
insertData += '</table> ';
document.getElementById ('dataArea').innerHTML = insertData;
}

 

新增加的內容,首先是兩個新變量的聲明:“subAry”和“subAryLen”。它們和之前的變量“dataArray”和“dataArrayLen”類似,除了它們指向不同的數組(特別是它們將指向那些“task”元素-當“dataArray”和“dataArrayLen”指向“pet”元素的時候)。

我們也改變了變量“insertData”的初始值-我們增加了一個表格頭(<th> )給我們的“tasks”字段。

下一步改變在于循環:我們把值賦給subAry和subAryLen變量。變量subAry成為當前<pet> 的<task> 元素的數組。變量subAryLen成為這個數組的長度,直到這個數組發生變化(當外部循環走到下一個<pet> 時)。

我們創建了一個內嵌的循環來處理所有的<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),所以我們必須認真對待這部分以確認我們的程序能夠正確運行。

現在我們已經讓PHP輸出XML了,我們現在所要作的就是登錄我們的mysql數據庫,并進行我們所需要的修改,來更新這個XML。很酷,不是嗎?我們仍然能夠使用上一篇文章中的js腳本來獲取代碼,因為XML輸出和之前的完全一樣。

結論

你可以再進一步的擴展,使用XML來保存和獲取數據。換句話說,你能夠使用php來寫你的XML文件,然后讓javascript來讀。用ajax,你也能夠定時的檢查xml文件是否已經更改而且,如果XML已經更新,也可以更新本頁面。

 

分享:解讀AJAX是否能夠取代桌面應用程序
一、 引言 在AJAX是否能夠取代桌面應用程序的問題上,存在很多爭論。如今,這兩種陣營正在逐步形成。在本文中,我的看法是:AJAX不可能取代桌面應用程序;但是它將導致一種新型軟件應用程序的出現。大多數AJAX程序應該會是生產工具、協作和商業應用程序。許

來源:模板無憂//所屬分類:AJAX教程/更新時間:2010-04-13
相關AJAX教程
www.日日操| 久久夜色精品国产| 久久夜色撩人精品| 亚洲图片欧美午夜| 亚洲护士老师的毛茸茸最新章节| 在线看一区二区| 91视频免费播放| 国模无码大尺度一区二区三区| 久久福利资源站| av在线这里只有精品| 懂色av中文字幕一区二区三区| 91精品又粗又猛又爽| 1024在线看片| 丰满岳乱妇国产精品一区| 超碰在线播放97| 亚洲乱码一区二区三区三上悠亚| 亚洲欧美国产va在线影院| 国产精品日韩在线| 中国日韩欧美久久久久久久久| 91精品国产综合久久香蕉922| 国产成人精品最新| 在线免费一区| 无遮挡亚洲一区| 国产精九九网站漫画| 九色|91porny| 欧美日韩国产成人高清视频| 久久精品国产99久久99久久久| 夜夜春很很躁夜夜躁| 日韩一级在线免费观看| 成年人网站免费在线观看 | 日韩在线小视频| 国产亚洲xxx| 三年中国中文在线观看免费播放| 日韩精品一线二线三线| 亚洲精品国产精品国自产观看| 日本五十熟hd丰满| 国产成人午夜99999| 欧美特黄级在线| 视频在线观看99| 色女孩综合影院| 亚洲色图20p| 激情伦成人综合小说| 国产一区中文字幕| 伊人久久99| wwwwww.欧美系列| 国产91精品网站| 人人妻人人澡人人爽精品欧美一区| 无码熟妇人妻av在线电影| 日本 片 成人 在线| www.久久av| 日韩高清不卡一区二区三区| 国产欧美日韩三区| 欧美性猛交xxxxxx富婆| 国产亚洲精品综合一区91| 久久99国产精品久久久久久久久| 欧美与动交zoz0z| 国产精品探花视频| 国产午夜亚洲精品理论片色戒| 亚洲色图清纯唯美| 国产91色在线|免| 亚洲一区二区自偷自拍| 成人性视频免费网站| 97国产精品久久| 色老头一区二区三区在线观看| 国产永久免费网站| 国产乱码精品一区二区三区av| 久久综合久久鬼色| 69堂亚洲精品首页| 999国内精品视频在线| 日韩欧美亚洲一区二区三区| 欧美日韩一区 二区 三区 久久精品| 久久久久久久国产精品| 超碰97在线资源| 国产伦精品一区三区精东| 丰满人妻一区二区| 99精品一区二区三区| 欧美美女直播网站| 大地资源高清在线视频观看| 亚洲三级小视频| 国产在线无码精品| 亚洲一区视频在线播放| 日韩三级在线观看视频| 夜夜爽8888| 欧美另类极品videosbest最新版本| 久久夜色精品国产噜噜亚洲av| 日本三级韩国三级久久| 国产亚洲欧美色| 999这里有精品| 精品一区二区在线视频| 欧美一区二区视频观看视频| 亚欧无线一线二线三线区别| 日韩av不卡一区二区| 91嫩草在线视频| 国产又大又长又粗又黄| 小明看看成人免费视频| 神马久久久久久久| 91麻豆免费看片| 精品午夜一区二区三区| 国产手机av在线| 日韩视频一区二区三区在线播放| aaaaa黄色片| 欧美日韩国产乱码电影| av免费在线观看不卡| 浮妇高潮喷白浆视频| 欧美一区二区三区免费视频 | 免费成人av在线| 亲子乱一区二区三区电影| 三级av在线免费观看| 精品99一区二区| 拔插拔插华人永久免费| 久久久久久久久毛片| 国产a级毛片一区| 欧美精品一区二区三区蜜桃视频| 97久久人人超碰caoprom欧美| 国产一区二区剧情av在线| 国产欧美一区二区在线播放| 97人妻精品一区二区三区| 欧美日本高清一区| 免费观看黄一级视频| 国产又粗又长又爽又黄的视频| 中文字幕精品国产| 国产高清亚洲一区| 51xx午夜影福利| 久久免费电影网| 国产911在线观看| 久久先锋资源网| 欧美精品欧美精品系列c| 成人免费视频一区| 欧美系列日韩一区| 欧美日韩视频在线一区二区观看视频| 日韩中文字幕有码| 亚洲欧美日韩国产综合| 成人午夜精品久久久久久久蜜臀| 丰满亚洲少妇av| 国产视频精品va久久久久久| 久久综合色综合| 国产精品久久久久久亚洲影视| 亚洲.国产.中文慕字在线| 日韩在线观看一区二区| 深夜视频在线观看| 国产精品久久一区二区三区| 亚洲同性同志一二三专区| 在线看免费毛片| 亚洲精品suv精品一区二区| 国产大陆a不卡| 一区二区在线观| 在线视频你懂得一区| 精品亚洲aⅴ无码一区二区三区| 97超级碰碰碰| 国产亚洲成年网址在线观看| 韩国v欧美v日本v亚洲| 韩国无码一区二区三区精品| 中文字幕乱码一区二区免费| 精品视频一区二区| 亚洲午夜一二三区视频| 国产亚洲精品久久久久久无几年桃| 欧美国产精品日韩| 午夜精品一二三区| 97国产在线播放| 97免费资源站| 欧美高跟鞋交xxxxxhd| 亚洲国产成人在线视频| 亚洲人成小说网站色在线 | 亚洲欧洲日本在线| 亚洲高潮女人毛茸茸| 成人资源视频网站免费| 国产精品萝li| 国产一级二级三级视频| 午夜精品久久久久久久久久| 国产精品久久久久7777| 久久精品亚洲乱码伦伦中文| 人妻无码一区二区三区四区| 久久久久久久久一| 久久国产视频一区| 日韩一级在线免费观看| 精品卡一卡二卡三卡四在线| 欧美一级黄色影院| 日韩美女视频在线观看| 欧美精品成人一区二区三区四区| 久久久久国产精品午夜一区| 日韩久久一级片| 亚洲国产精品久久久男人的天堂| 精品无码一区二区三区蜜臀| 国产精品香蕉视屏| av亚洲精华国产精华| 免费黄色特级片| 色综合天天狠天天透天天伊人| 日韩天堂在线观看| 午夜一区在线观看| 深夜福利网站在线观看| 国产精品高潮呻吟久久av无限| 欧美日韩性视频| 日本黄色三级网站| 精品一区二区三区日本| 久久久久久久久久久成人| 久久精品中文字幕免费mv| 蜜臀久久99精品久久久久久宅男 | 91精品一区二区三区久久久久久 | 成人小视频在线看| 欧美人在线观看| 欧美激情一区二区三区不卡| av网站免费在线播放| 国产欧美亚洲视频| 日本老师69xxx| 久久伊人精品视频| 99久久免费视频.com| 午夜精品久久久久久久96蜜桃 | 成人午夜福利视频| 成年人一级黄色片| 日韩肉感妇bbwbbwbbw| 97中文字幕在线| www婷婷av久久久影片| 久久综合色视频| 狠狠躁狠狠躁视频专区| 国产a级黄色大片| 成人9ⅰ免费影视网站| 欧美成人精品二区三区99精品| 亚洲美女区一区| 一级性生活毛片| 免费拍拍拍网站| 亚洲欧洲日产国码av系列天堂| av电影在线观看完整版一区二区| 99草在线视频| 亚洲一区欧美在线| 日本高清一区二区视频| 久久精品国产精品青草色艺| 91高清视频免费观看| 国产一区二区黄| 精品国产黄色片| 无码久久精品国产亚洲av影片| 朝桐光av一区二区三区| 好吊色欧美一区二区三区四区 | 成人免费看片'免费看| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 国产精品毛片一区视频| 亚洲色图19p| 欧洲中文字幕精品| 久久天堂av综合合色蜜桃网| 亚洲xxxx天美| av中文字幕第一页| 日本sm残虐另类| 精品国产电影| 91精品国产亚洲| 精品奇米国产一区二区三区| 国产婷婷色一区二区三区在线| 污视频网站观看| 欧美亚洲日本在线观看| 97在线观看视频| 欧美视频中文字幕| 国内精品免费**视频| 豆国产97在线 | 亚洲| 成年人小视频网站| 国产精品三区四区| 综合网中文字幕| 亚洲精品v日韩精品| 久久精品国产99| 精品无码一区二区三区蜜臀| 精品国偷自产一区二区三区| 国内精品一区二区三区| 欧美日韩中文字幕一区二区| 成人av片在线观看| 国产乱淫片视频| 久久精品亚洲a| 天天操天天干天天做| 乱子伦一区二区| 黄色国产精品一区二区三区| 国产欧美精品一区二区三区| 亚洲aaa激情| 日韩亚洲一区在线播放| 人人干视频在线| 亚洲综合中文字幕68页| 国产精品久久激情| 欧美在线观看网址综合| 久久91精品国产91久久跳| 中文字幕日韩av电影| 亚洲免费av电影| 欧美另类z0zxhd电影| 1区2区3区精品视频| 国产精品免费丝袜| 亚洲一区视频在线| 午夜精品福利视频网站| 亚洲一区影音先锋| 一本久久综合亚洲鲁鲁五月天| 成人免费在线播放视频| 2017欧美狠狠色| 中文字幕五月欧美| 亚洲免费成人av| 一区二区三区成人在线视频| 亚洲午夜久久久久久久久久久| 欧美日韩在线视频一区| 在线观看日韩精品| 亚洲精品久久久久国产| 久久综合久久88| 91av在线播放| 超碰在线观看97| 手机在线看福利| 久久久久麻豆v国产| ,亚洲人成毛片在线播放| 青青草97国产精品免费观看| 久久久久久久久久久久久久久99| 亚洲一区二区三区四区不卡| 日韩亚洲欧美在线观看| 日韩视频中文字幕| 国产精品一区在线观看| 国产aaa一级片| 在线观看免费小视频| www.黄色小说.com| 久久国产麻豆精品| 一区二区三区中文在线观看| 亚洲第一视频网| 亚洲天堂日韩电影| 国模吧一区二区三区| 国产在线一区二区三区播放| 国产系列第一页| 黄色片在线免费| 精品国产成人亚洲午夜福利| 毛片在线免费视频| 日韩av不卡一区二区| 国产午夜精品福利| 欧美日韩亚洲不卡| 久久国产精品网站| 粉嫩精品一区二区三区在线观看| 日韩国产小视频| 中文字幕在线免费看线人| 亚洲免费在线观看av| 日韩成人av影视| 亚洲免费在线看| 亚洲欧美激情视频| 91久久国产婷婷一区二区| 久激情内射婷内射蜜桃| 少妇高潮惨叫久久久久| 亚洲成人一二三区| 亚洲欧美另类久久久精品| 亚洲嫩模很污视频| 精品国产一区二区三区日日嗨| 午夜两性免费视频| a片在线免费观看| 91看片淫黄大片一级| 精品国产精品网麻豆系列| 国产精品午夜国产小视频| 日本美女高潮视频| 午夜影院免费在线观看| 成人av中文字幕| 99精品国产高清在线观看| 五月天色婷婷丁香| 久久久国际精品| 国产精品自产拍在线观| 久久国产一级片| 99国产精品久久久久久久久久久| 日韩av综合网站| 久久人人97超碰人人澡爱香蕉| 亚洲综合伊人久久| 国产www在线| www.在线欧美| 日韩中文字幕视频在线观看| 正在播放亚洲| 国产免费嫩草影院| 狠狠久久亚洲欧美专区| 一本色道无码道dvd在线观看| 久久久久久久久岛国免费| 一区二区不卡在线视频 午夜欧美不卡' | 蜜桃久久av一区| 国产精品人成在线观看免费| 亚洲国产婷婷香蕉久久久久久 | 日韩国产在线一区| 国产成人精品视频ⅴa片软件竹菊| 美女一区二区三区| 亚洲人成在线观看| 久久99精品久久久久久秒播放器| 亚洲xxx在线观看| 亚洲第一成年人网站| 欧美日本韩国一区二区三区视频| 国产免费久久av| 欧美午夜激情影院| 久久综合国产精品| 国外成人在线播放| 色网站在线视频| 国产综合久久久久久鬼色| 91精品国产色综合久久不卡电影| 国产精品av一区| 中文字幕视频免费观看| 天天色综合成人网| 青春草国产视频| 久久精品国产成人一区二区三区 | 最近免费观看高清韩国日本大全| 亚洲精品成人电影| 夜夜嗨av一区二区三区四区| 伊人av在线播放| ...xxx性欧美| 亚洲午夜精品国产| 麻豆中文一区二区| 亚洲一区二区三区毛片 | 久久久999免费视频| 成人高清视频免费观看| 91精品视频观看| 一级做a爱片性色毛片| 色yeye香蕉凹凸一区二区av| 欧美偷拍一区二区三区| 色哟哟在线观看一区二区三区| 和岳每晚弄的高潮嗷嗷叫视频| 成人激情av网| 久久一区二区三区av| 天堂一区二区在线| 国产欧美在线观看| 午夜精品小视频| 国产成人91久久精品| www夜片内射视频日韩精品成人| 热久久免费国产视频| 黄色美女一级片| 成人淫片在线看|