2018-5-29 周周
傳統(tǒng)方法的缺點(diǎn):
傳統(tǒng)的web交互是用戶觸發(fā)一個(gè)http請(qǐng)求服務(wù)器,然后服務(wù)器收到之后,在做出響應(yīng)到用戶,并且返回一個(gè)新的頁面,,每當(dāng)服務(wù)器處理客戶端提交的請(qǐng)求時(shí),客戶都只能空閑等待,并且哪怕只是一次很小的交互、只需從服務(wù)器端得到很簡(jiǎn)單的一個(gè)數(shù)據(jù),都要返回一個(gè)完整的HTML頁,而用戶每次都要浪費(fèi)時(shí)間和帶寬去重新讀取整個(gè)頁面。這個(gè)做法浪費(fèi)了許多帶寬,由于每次應(yīng)用的交互都需要向服務(wù)器發(fā)送請(qǐng)求,應(yīng)用的響應(yīng)時(shí)間就依賴于服務(wù)器的響應(yīng)時(shí)間。這導(dǎo)致了用戶界面的響應(yīng)比本地應(yīng)用慢得多。
什么是ajax?
ajax的出現(xiàn),剛好解決了傳統(tǒng)方法的缺陷。AJAX 是一種用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁的技術(shù)。通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對(duì)網(wǎng)頁的某部分進(jìn)行更新。
XMLHttpRequest 對(duì)象
XMLHttpRequest對(duì)象是ajax的基礎(chǔ),XMLHttpRequest 用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對(duì)網(wǎng)頁的某部分進(jìn)行更新。目前所有瀏覽器都支持XMLHttpRequest。
方法
|
描述
|
abort() |
停止當(dāng)前請(qǐng)求 |
getAllResponseHeaders() |
把HTTP請(qǐng)求的所有響應(yīng)首部作為鍵/值對(duì)返回 |
getResponseHeader("header") |
返回指定首部的串值 |
open("method","URL",[asyncFlag],["userName"],["password"]) |
建立對(duì)服務(wù)器的調(diào)用。method參數(shù)可以是GET、POST或PUT。url參數(shù)可以是相對(duì)URL或絕對(duì)URL。這個(gè)方法還包括3個(gè)可選的參數(shù),是否異步,用戶名,密碼 |
send(content) |
向服務(wù)器發(fā)送請(qǐng)求 |
setRequestHeader("header", "value") |
把指定首部設(shè)置為所提供的值。在設(shè)置任何首部之前必須先調(diào)用open()。設(shè)置header并和請(qǐng)求一起發(fā)送 ('post'方法一定要 ) |
1.創(chuàng)建XMLHTTPRequest對(duì)象
2.使用open方法設(shè)置和服務(wù)器的交互信息
3.設(shè)置發(fā)送的數(shù)據(jù),開始和服務(wù)器端交互
4.注冊(cè)事件
5.更新界面
下面給大家列出get請(qǐng)求和post請(qǐng)求的例子 :
get請(qǐng)求:
//步驟一:創(chuàng)建異步對(duì)象
var ajax = new XMLHttpRequest();
//步驟二:設(shè)置請(qǐng)求的url參數(shù),參數(shù)一是請(qǐng)求的類型,參數(shù)二是請(qǐng)求的url,可以帶參數(shù),動(dòng)態(tài)的傳遞參數(shù)starName到服務(wù)端
ajax.open('get','getStar.php?starName='+name);
//步驟三:發(fā)送請(qǐng)求
ajax.send();
//步驟四:注冊(cè)事件 onreadystatechange 狀態(tài)改變就會(huì)調(diào)用
ajax.onreadystatechange = function () {
if (ajax.readyState==4 &&ajax.status==200) {
//步驟五 如果能夠進(jìn)到這個(gè)判斷 說明 數(shù)據(jù) 完美的回來了,并且請(qǐng)求的頁面是存在的
console.log(xml.responseText);//輸入相應(yīng)的內(nèi)容
}
}
post請(qǐng)求:
//創(chuàng)建異步對(duì)象
var xhr = new XMLHttpRequest();
//設(shè)置請(qǐng)求的類型及url
//post請(qǐng)求一定要添加請(qǐng)求頭才行不然會(huì)報(bào)錯(cuò)
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.open('post', '02.post.php' );
//發(fā)送請(qǐng)求
xhr.send('name=fox&age=18');
xhr.onreadystatechange = function () {
// 這步為判斷服務(wù)器是否正確響應(yīng)
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
};
為了方便使用,我們可以把他封裝進(jìn)方法里面,要用的時(shí)候,直接調(diào)用就好了。
function ajax_method(url,data,method,success) {
// 異步對(duì)象
var ajax = new XMLHttpRequest();
// get 跟post 需要分別寫不同的代碼
if (method=='get') {
// get請(qǐng)求
if (data) {
// 如果有值
url+='?';
url+=data;
}else{
}
// 設(shè)置 方法 以及 url
ajax.open(method,url);
// send即可
ajax.send();
}else{
// post請(qǐng)求
// post請(qǐng)求 url 是不需要改變
ajax.open(method,url);
// 需要設(shè)置請(qǐng)求報(bào)文
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 判斷data send發(fā)送數(shù)據(jù)
if (data) {
// 如果有值 從send發(fā)送
ajax.send(data);
}else{
// 木有值 直接發(fā)送即可
ajax.send();
}
}
// 注冊(cè)事件
ajax.onreadystatechange = function () {
// 在事件中 獲取數(shù)據(jù) 并修改界面顯示
if (ajax.readyState==4&&ajax.status==200) {
// console.log(ajax.responseText);
// 將 數(shù)據(jù) 讓 外面可以使用
// return ajax.responseText;
// 當(dāng) onreadystatechange 調(diào)用時(shí) 說明 數(shù)據(jù)回來了
// ajax.responseText;
// 如果說 外面可以傳入一個(gè) function 作為參數(shù) success
success(ajax.responseText);
}
}
}
藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.teruid.com