ajax使用詳解

一ajax的基本原理

wKioL1MTPZ6gn-KjAADfQWPTh6I563.jpg

   1 創建XmlHttpRequest對象。

   2 創建請求。

   3 根據監控的readyState值的變化實現當服務器返回數據時調用回調函數。

   4 發送請求

   5 接收服務器返回的數據(該步驟可以和會和步驟3合併)

二ajax使用基本流程

    ajax的使用主要是實現上面的原理圖。

    1 創建XMLHttpRequest對象,由於這段代碼是固定的夜視第一步,所以我們一般將其封裝爲一個函數createXMLHttpRequest();

function createXMLHttpRequest(){
var request;
if(window.XMLHttpRequest){//火狐
request= new  XMLHttpRequest();
}else if{
request = new ActiveXObject("Msxml2.XMLHTTP");//IE
}
return request;
}

    2 使用XMLHttpRequest對象創建請求

wKiom1MTQ4bAl4XaAAB9B8OVABc746.jpg    

var req=createXMLHttpRequest();
req.open("get","testAjaxServlet");

   3 監視response狀態,寫回調函數處理服務器返回的數據

        (1)服務端響應

wKiom1MTSKmwU-2_AACl6X4HfMQ690.jpg

       (2)XMLHttpRequest的readyState

wKiom1MTSe7wWVX5AAECqTfyuOU367.jpg

req.onreadystatechange=function(){
if(req.ready==4){
var result=request.responseTest;//得到服務端返回的數據
document.getElementById("div2").innerHTML=result;//js操作DOM將數據寫到頁面對象中,實現局部刷新
}
}

  注:上述代碼僅僅是一個實例,說明了在什麼狀態下接受數據,顯示數據

4 使用XMLHttpRequest對象發送請求

req.send(null);//如果不寫null,火狐會報錯

三ajax的傳參方式和接受數據的方式

  注:由於開發需要,傳參方式和接受數據的形式會不同,接下來重點討論

1 兩種傳參方式post和get

   get方式:更簡單也更快,並且在大部分情況下都能用,容易被緩存(因爲是小數據)

   post方式:

  • 無法使用緩存文件(更新服務器上的文件或數據庫)

  • 向服務器發送大量數據(POST 沒有數據量限制)

  • 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠

2 ajax接受數據的方式

   (1)普通文本數據

       req.responseTest得到返回的文本數據

   (2)XML數據

      1)處理

            a)服務端            

response.setContentType("test/xml;charset=utf-8");//通過ajax寫xml數據最好使用utf-8
response.getWriter().println("<resume><name>朱元璋</name></resume>");

            b)客戶端

req.responseXML.getElementsByTagName("name")[0].firstChild.data;

      2)評價

            a)優勢

                1 xml數據通用。有很多編輯、解析工具

                2 xml標記有屬性、以及xml命名空間等,從而寫出非常通用的程序。

            b)劣勢

                1 js解析xml的難度較大,尤其是在瀏覽器差異方面。

                2 xml數據經常有冗餘現象。

   (3)JSON(javascript  object  native)

      1)處理

            a)servlet中             

sb.append("{name:'朱元璋',age:'32',job:'皇帝'}");
sb.append("[{age:1,name:'a'},{age:2,name:'b'},{age:3,name:'c'}]");//作爲對象數組返回

            b)瀏覽器端

var a=req.responseTest;
eval("var c="+a);//利用eval函數將返回的文本轉化成js對象

      2)評價

            a)優勢

                1 解析容易,經過eval執行後直接解析爲js對象,不需要經過其他中間步驟

                2 可以表達比較複雜的數據組織關係

                3 甚至可以通過json方式直接執行服務器端傳來的js函數

            b)劣勢

                1 xml屬性和命名空間不能直接處理

四ajax實例

     1搜索殷勤預覽功能

     2 google  suggest功能

     3 ajax三級聯動

     4 拖曳效果實現購物車

     5 ajax樹結構

     6 ajax面板效果

五ajax類庫的封裝

工具類:AjaxUtil.js

var AjaxUtil = {
// 基礎選項
options : {
method : "get", // 默認提交的方法,get post
url : "", // 請求的路徑 required
params : {}, // 請求的參數
type : 'text', // 返回的內容的類型,text,xml,json
callback : function() {
}// 回調函數 required
},
// 創建XMLHttpRequest對象
createRequest : function() {
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");// IE6以上版本
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// IE6以下版本
} catch (e) {
try {
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType("text/xml");
}
} catch (e) {
alert("您的瀏覽器不支持Ajax");
}
}
}
return xmlhttp;
},
// 設置基礎選項
setOptions : function(newOptions) {
for ( var pro in newOptions) {
this.options[pro] = newOptions[pro];
}
},
// 格式化請求參數
formateParameters : function() {
var paramsArray = [];
var params = this.options.params;
for ( var pro in params) {
var paramValue = params[pro];
paramsArray.push(pro + "=" + paramValue);
}
return paramsArray.join("&");
},
// 狀態改變的處理
readystatechange : function(xmlhttp) {
// 獲取返回值
var returnValue;
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
switch (this.options.type) {
case "xml":
returnValue = xmlhttp.responseXML;
break;
case "json":
var jsonText = xmlhttp.responseText;
if(jsonText){
returnValue = eval("(" + jsonText + ")");
}
break;
default:
returnValue = xmlhttp.responseText;
break;
}
if (returnValue) {
this.options.callback.call(this, returnValue);
} else {
this.options.callback.call(this);
}
}
},
// 發送Ajax請求
request : function(options) {
var ajaxObj = this;
// 設置參數
ajaxObj.setOptions.call(ajaxObj, options);
// 創建XMLHttpRequest對象
var xmlhttp = ajaxObj.createRequest.call(ajaxObj);
// 設置回調函數
xmlhttp.onreadystatechange = function() {
ajaxObj.readystatechange.call(ajaxObj, xmlhttp);
};
// 格式化參數
var formateParams = ajaxObj.formateParameters.call(ajaxObj);
// 請求的方式
var method = ajaxObj.options.method;
var url = ajaxObj.options.url;
if ("GET" === method.toUpperCase()) {
url += "?" + formateParams;
}
// 建立連接
xmlhttp.open(method, url, true);
if ("GET" === method.toUpperCase()) {
//發送請求
xmlhttp.send(null);
} else if ("POST" === method.toUpperCase()) {
// 如果是POST提交,設置請求頭信息
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
//發送請求
xmlhttp.send(formateParams);
}
}
};

使用實例

function findUser() {
var userid = $("userid").value;
if (userid) {
AjaxUtil.request({
url:"servlet/UserJsonServlet",
params:{id:userid},
type:'json',
callback:process
});
}
}
function process(json){
if(json){
$("id").innerHTML = json.id;
$("username").innerHTML = json.username;
$("age").innerHTML = json.age;
}
else{
$("msg").innerHTML = "用戶不存在";
$("id").innerHTML = "";
$("username").innerHTML = "";
$("age").innerHTML = "";
}
}
function $(id) {
return document.getElementById(id);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章