1.什么是Ajax? (asynchronous javascript and xml)
是一種用來改善用戶體驗的技術(shù),其實質(zhì)是利用瀏覽器提供的一個特殊對象(xmlhttpRequest)異步地向服務器發(fā)送請求,
服務器返回部分數(shù)據(jù),瀏覽器利用這些數(shù)據(jù)對當前頁面做局部更新,整個過程,頁面無刷新,不打斷用戶的操作。
注:
異步: 當ajax對象(XMLHttPRequest)向服務器發(fā)送請求的時候,瀏覽器不會銷毀當前頁面,用戶仍然可以對當前頁面做其它操作。
使用BS結(jié)構(gòu)時:
使用AJAX工作原理:
2.ajax對象
(1)如何獲得該對象?
function getXhr(){
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('microsoft.XMLHttp');
}
return xhr;
}
(2)幾個重要屬性
1)onreadystatechange:綁訂事件處理函數(shù),用來處理readystatechange事件。
注:
當ajax對象的readystate屬性值發(fā)生了改變,比如從0變成了1,就會產(chǎn)生該事件。
2)readyState:有五個值,分別是0,1,2,3,4,表示ajax對象通信的狀態(tài),其中,4表示ajax對象已經(jīng)獲得了服務器返回的所有的數(shù)據(jù)。
3)responseText:獲得服務器返回文本數(shù)據(jù)。
4)responseXML:獲得服務器返回的xml文檔。
5)status:獲得狀態(tài)碼。
3.編程步驟
step1,獲得ajax對象
比如: var xhr = getXhr();
step2,發(fā)送請求
1)get請求
xhr.open('get','check_uname.do?username=Tom',true);
xhr.onreadystatechange=f1;
xhr.send(null);
注
true:異步地(當ajax對象(XMLHttpRequest)向服務器發(fā)送請求的時候,瀏覽器不會銷毀當前頁面,用戶仍然可以對當前頁面做其它操作)。
false:同步地(當ajax對象(XMLHttpRequest)向服務器發(fā)送請求的時候,瀏覽器不會銷毀當前頁面,瀏覽器會鎖定當前頁面,用戶不
能夠?qū)Ξ斍绊撁孀銎渌僮?。
2)post請求
xhr.open('post','check_uname.do',true);
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
xhr.onreadystatechange=f1;
xhr.send('username=Tom');
注:
ajax對象在發(fā)送post請求時,默認不會添加"content-type"消息頭,所以,需要調(diào)用setRequestHeader方法來手動添加。
step3,編寫服務器端的處理程序。一般來說,服務器端不需要返回完整的頁面,只需要返回部分的數(shù)據(jù)。
step4,事件處理函數(shù)
function f1(){
//獲得服務器返回的部分數(shù)據(jù)
if(xhr.readyState == 4 && xhr.status == 200){
var txt = xhr.responseText;
//更新頁面
...
}
}
4.緩存問題
(1)什么是緩存問題?
ie瀏覽器在發(fā)送get請求時,會比較請求地址是否訪問過,如果訪問過,則不再發(fā)送新的請求,而是顯示之前的訪問的結(jié)果。
(2)解決方式
在請求地址后面添加上一個隨機數(shù)。
xhr.open('get','shownumber.do?'+Math.random(),true);
5.編碼問題
(1)get請求
1)為什么會產(chǎn)生亂碼?
對于中文參數(shù)值,ie瀏覽器會使用"gbk"來編碼,其它瀏覽器會使用"utf-8"來編碼。服務器端默認會使用"iso-8859-1"來解碼。
2)如何解決?
step1,服務器端統(tǒng)一使用"utf-8"來解碼。
修改tomcat的server.xml文件<Connector URIEncoding="utf-8"/>
注:只針對get請求有效。
step2,使用encodeURI函數(shù)對請求參數(shù)進行編碼。
注:encodeURI是一個內(nèi)置的函數(shù),會使用utf-8來編碼。
var uri = 'check.do?username='+$F('username');
xhr.open('get',encodeURI(uri),true);
(2)post請求
1)為什么會產(chǎn)生亂碼?
瀏覽器會使用"utf-8"來編碼。而服務器默認使用"iso-8859-1"來解碼。
2)如何解決?
request.setCharacterEncoding("utf-8");
6.json(Javascript object notation)
www.json.org
(1)json是什么?
輕量級的數(shù)據(jù)交換格式
1)數(shù)據(jù)交換
將要交換的數(shù)據(jù)轉(zhuǎn)換成一種與平臺無關(guān)的數(shù)據(jù)格式(比如xml),然后交給接收方來處理。
2)輕量級
相對于xml,json文檔要更小,解析速度要更快。
(2)基本語法
1)表示一個對象
{屬性名:屬性值,屬性名:屬性值...}
var obj = {"name":"明樓","age":33};
注:
a.屬性名必須使用雙引號括起來。
b.屬性值可以是string,number,true/false,null,object。
c.屬性值如果是string,必須使用雙引號括起來。
2)表示由多個對象組成的數(shù)組
[{},{},{}....]
var arr = [{"name":"明樓","age":23},{"name":"明臺","age":33}];
(3)如何使用json?
1)將java對象(或者java對象組成的數(shù)組或者集合)轉(zhuǎn)換成json字符串的形式。
使用json提供的jar包JSONObject,JSONArray
java對象:
JSONObject obj = JSONObject.fromObject(s);
String jsonStr = obj.toString();
java對象組成的數(shù)組或集合:
JSONArray obj = JSONArray.fromObject(stocks);
String jsonStr = obj.toString();
2)將json字符串轉(zhuǎn)換成javascript對象(或者javascript對象組成的數(shù)組)。
prototype.js提供的evalJSON()函數(shù)。
$(id): 依據(jù)id查找節(jié)點。
$F(id): 依據(jù)id查找節(jié)點,返回value。
strip():除掉字符串兩端的空格。
evalJSON():將json字符串轉(zhuǎn)換成javascript對象或者javascript對象組成的數(shù)組。
json字符串轉(zhuǎn)換成javascript對象:
var str = '{"code":"600015","name":"山東高速","price":10}';
var obj = str.evalJSON();
java字符串轉(zhuǎn)換成javascript對象組成的數(shù)組:
var str = '[{"name":"明樓","age":23},{"name":"明臺","age":33}]';
var arr = str.evalJSON();
新聞熱點
疑難解答