【日期】0:15 2008-6-16
===========================
Ajax的請求/響應模式
0、觸發Ajax事件
1、建立XMLHttpRequest對象
2、open()方法:建立對伺服器的調用
3、為onreadystatechange指定事件處理函數
4、send()方法:向伺服器(CGI程式)發出請求
5、(請求返回到瀏覽器)
6、響應事件處理函數
—————————
建立XMLHttpRequest對象
JavaScript代碼
- //相容不同瀏覽器
- if(window.ActiveXObject && !window.XMLHttpRequest)
- {
- window.XMLHttpRequest = function()
- {
- var MSXML = ['Msxml2.XMLHTTP.5.0',
- 'Msxml2.XMLHTTP.4.0',
- 'Msxml2.XMLHTTP.3.0',
- 'Msxml2.XMLHTTP',
- 'Microsoft.XMLHTTP'];
- for(var i = 0; i < msxmls.length; i++)
- {
- try{
- return new ActiveXObject(msxmls[i]);
- }catch(e){}
- }
- return null;
- };
- }
- var xmlHttp = new XMLHttpRequest();//建立XMLHttpRequest對象
另一種方式:
JavaScript代碼
- function createXMLHttpRequest()
- {
- var xmlHttp;
- try{
- xmlHttp = new XMLHttpRequest();
- }catch(e){
- var MSXML = new Array( “MSXML2.XMLHTTP.6.0″,
- “MSXML2.XMLHTTP.5.0″,
- “MSXML2.XMLHTTP.4.0″,
- “MSXML2.XMLHTTP.3.0″,
- “MSXML2.XMLHTTP”,
- “Microsof.XMLHTTP”);
- for(var i=0; i<MSXML.length && !xmlHttp; i++)
- {
- try{
- xmlHttp = new ActiveXObject(MSXML[i]);
- }catch(e){}
- }
- }
- if(!xmlHttp)
- alert(“Ajax Error!”);
- else return xmlHttp;
- }
- var xmlHttp = new createXMLHttpRequest();//建立XMLHttpRequest對象
———————————————————
open()方法
open(”method”, “url”, bool)
例:xmlHttp.open(”GET”, “http://127.0.0.1/clients.xml”, true);
——————————————————————
XMLHttpRequest屬性:
onreadystatechange
每個狀態改變時都會觸發這個事件處理器,通常會調用一個JavaScript函數
…………………………………………………………………………………………
readyState
請求的狀態。有5個可取值:0 = 未初始化,1 = 正在載入,2 = 已載入,3 = 互動中,4 = 完成
…………………………………………………………………………………………
responseText
伺服器的響應,表示為一個字串
…………………………………………………………………………………………
responseXML
伺服器的響應,表示為XML。這個對象可以解析為一個DOM對象
…………………………………………………………………………………………
status
伺服器的HTTP狀態代碼(200對應OK,404對應Not Found(未找到),等等)
…………………………………………………………………………………………
statusText
HTTP狀態代碼的相應文本(OK或Not Found(未找到)等等)
…………………………………………………………………………………………
【日期】0:56 2008-6-17
===========================
部分內容寫成函數實現:
JavaScript代碼
- function startAjaxRequest(type)
- {
- requestType = type; //動作型別參數
- xmlHttp = new XMLHttpRequest();//建立XMLHttpRequest對象
- xmlHttp.onreadystatechange = handleStateChange;
- xmlHttp.open(“GET”, “http://127.0.0.1/DIY_lib/XML/clients.xml”, true);
- xmlHttp.setRequestHeader(“If-Modified-Since”,“0″); //禁止緩衝
- xmlHttp.send(null);
- }
- function handleStateChange()
- {
- if(requestType == “clear”)
- {
- clearInfo();
- }else if(requestType == “show”)
- {
- showInfo();
- }
- }
- function clearInfo()
- {
- info.innerHTML = “”;
- }
- function showInfo()
- {
- if(xmlHttp.readyState==4 && xmlHttp.status == 200)
- {
- info.innerHTML = xmlHttp.responseText;
- }
- }
【日期】2008-8-18
===========================
操作DOM(一):
document.getElementById(’html_id’)
返回HTML中標籤id為html_id的元素對象
按W3C標準改寫上面兩個函數
JavaScript代碼
- function clearInfo()
- {
- document.getElementById(‘info’).innerHTML = “”;
- }
- function showInfo()
- {
- if(xmlHttp.readyState==4 && xmlHttp.status == 200)
- {
- document.getElementById(‘info’).innerHTML = xmlHttp.responseText;
- }
- }
使用responseXML方法處理XML響應資訊:
XML檔案樣本
XML/HTML代碼
- <datetime>
- <date>
- <state>2008-1-1</state>
- <state>2008-2-2</state>
- </date>
- <time>
- <state>11:11:11</state>
- <state>22:22:22</state>
- </time>
- </datetime>
PHP頁面返回xml文檔方法:
header(”Content-type: application/xml”);
js中讀取DOM部分代碼
JavaScript代碼
- var xmlDoc = xmlHttp.responseXML;
- var userDoc = xmlDoc.getElementsByTagName(‘datetime’)[0];
- var data = userDoc.getElementsByTagName(‘date’)[0];
- var data1 = userDoc.getElementsByTagName(‘time’)[0];
- var info_date = data.getElementsByTagName(’state’)[0].childNodes[0].nodeValue;
- var info_time = data1.getElementsByTagName(’state’)[0].childNodes[0].nodeValue;
結果為:
info_date: 2008-1-1
info_time: 11:11:11
最後兩行修改為
JavaScript代碼
- var info_date = data.getElementsByTagName(’state’)[1].childNodes[0].nodeValue;
- var info_time = data1.getElementsByTagName(’state’)[1].childNodes[0].nodeValue;
結果為:
info_date: 2008-2-2
info_time: 22:22:22
【日期】2008-8-19
===========================
操作DOM(二):
添加表格內容
新增兩個函數
JavaScript代碼
- function addTableRow(date, time) //添加新行
- {
- var row = document.createElement(“tr”); //建立tr元素,返回行對象
-
- var cell = createCellWithText(date); //調用函數,建立文本
- row.appendChild(cell); //把文本添加到行對象
- cell = createCellWithText(time);
- row.appendChild(cell);
-
- document.getElementById(“table1″).appendChild(row); //把行對象添加到指定元素中
- }
-
- function createCellWithText(text) //建立常值內容
- {
- var cell = document.createElement(“td”); //建立td元素,返回cell對象
- var textNode = document.createTextNode(text); //建立文本節點
- cell.appendChild(textNode); //添加到cell對象
- return cell;
- }
調用方法:
addTableRow(info_date, info_time);
註:html中表格需要用tbody標籤
例:
<TABLE>
<tbody id=”table1″>
</tbody>
</TABLE>
【日期】2008-8-20
===========================
操作DOM(三):
綜合執行個體應用
參見項目card源碼
備忘:
document.getElementByTagName() 傳回值類型:數組——————————————–
建立帶格式常值內容
JavaScript代碼
- var flag = document.createElement(flag); //建立格式標籤
- flag.setAttribute(‘align’,‘center’); //設定標籤屬性
- flag.innerHTML = text; //標籤後的內容
產生XML的php檔案若包含中文,需要用UTF-8格式儲存
【日期】23:07 2008-9-1
===========================
JSON應用:
將JSON資料賦值給變數(例):
JavaScript代碼
- var company =
- { “employees”: [
- { "firstName": "Brett", "lastName":"McLaughlin", "email": brett@newInstance.com" },
- { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
- { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
- ]
- };
擷取第一個僱員的firstName資訊:company.employees[0].fristName
————————————————————-
JSON的接收(例)
1、伺服器端返回JSON相應的文本表示
{“city” : “Hefei”, “province” : “Anhui”}
2、使用eval()函數將JSON文本轉化為JavaScript對象
var response = eval(”(” + xmlHttp.responseText + “)”);
註:使用額外的圓括弧可使eval()函數將來源輸入無條件地視為運算式進行解析
3、從對象中取得相應的值
response.city
response.province
【Q&A】
======================
Q1:GET or POST?
A1:使用POST方法(例)
JavaScript代碼
- var requestObj = new XMLHTTPRequest();
- var newData = “name=linvo&pwd=123″;
- requestObj.open(“POST”, “do.php”, true);
- requestObj.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded; charset=UTF-8′);
- requestObj.send(newData);
Q2:為什麼修改了XML檔案的內容後,ajax擷取來的還顯示原來的內容?
A2:xmlHttp.setRequestHeader(”If-Modified-Since”,”0″); //禁止緩衝