什么是ajax
Ajax(Asynchronous JavaScript and XML),是一種可以向服務(wù)器請求額外的數(shù)據(jù)并且無需刷新頁面的技術(shù),ajax的出現(xiàn)帶來了更好的用戶體驗.
Ajax的核心就是XMLHttpRequest(XHR)對象.XHR為向服務(wù)器發(fā)送請求和解析服務(wù)器響應提供了流暢的接口.可以使用XHR對象獲取新數(shù)據(jù),通過DOM將新數(shù)據(jù)插入到頁面.雖然名字中包含XML,但是ajax通信和數(shù)據(jù)格式無關(guān);這種技術(shù)就是可以不用刷新就從服務(wù)器獲取數(shù)據(jù),但是不一定是XML數(shù)據(jù),也可以是json.
XMLHttpRequest對象
XHR的用法
1.創(chuàng)建一個XMLHttpRequest對象
2.發(fā)送請求
1).設(shè)置請求行 xhr.open()
2).POST請求需要設(shè)置請求頭 xhr.setRequestHeader() POST請求頭Content-Type的值: application/x-www-form-urlencoded
3).設(shè)置請求體 xhr.send() get請求傳null,post根據(jù)情況
3.處理服務(wù)器響應
先判斷響應狀態(tài)碼和異步對象是否解析完畢.
服務(wù)器返回的狀態(tài)碼 status
1xx:消息
2xx:成功
3xx:重定向
4xx:請求錯誤
5xx:服務(wù)器錯誤
異步對象的狀態(tài)碼 readystate
0:異步對象已經(jīng)創(chuàng)建
1:異步對象初始化完成,發(fā)送請求
2:接收服務(wù)器返回的原始數(shù)據(jù)
3:數(shù)據(jù)正在解析,解析需要時間
4:數(shù)據(jù)解析完成,數(shù)據(jù)可以使用了
XML
XML的特點,出身名門,W3C制定,微軟和IBM曾經(jīng)共同大力推薦過的數(shù)據(jù)格式.XML 指可擴展標記語言(Extensible Markup Language),被設(shè)計用來傳輸和存儲數(shù)據(jù),HTML 是設(shè)計用來表示頁面的.
語法規(guī)則:和HTML差不多,都是通過標記來表示的
特殊符號:比如>要使用實體-轉(zhuǎn)移字符
xml的解析需要前后臺配合:
1.后臺在返回的時候,在響應頭中設(shè)置Content-Type的值為 application/xml
2.前臺異步對象在接收后臺數(shù)據(jù)時,記得按照xml的方式來接收,xhr.responseXML,并且它返回的是一個object對象,內(nèi)容是#document
JSON
JSON(JavaScript Object Notation),出身草根,是 Javascript 的子集,專門負責描述數(shù)據(jù)格式.JSON本身是一個特殊格式的字符串,可以轉(zhuǎn)換成js對象,是網(wǎng)絡(luò)上用來傳輸數(shù)據(jù)使用最廣泛的數(shù)據(jù)格式,沒有之一.
語法規(guī)則:數(shù)據(jù)以 key/value 值對表示,數(shù)據(jù)由逗號分隔,大括號保存對象,中括號保存數(shù)組,名稱和值都需要使用雙引號包含(這個是和js的一點小區(qū)別).
js中解析/操作JSON:
1.JSON.parse(json字符串); 將一個json格式的字符串解析成js對象
2.JSON.stringify(js對象); 將一個js對象轉(zhuǎn)成一個json格式的字符串
自己封裝一個ajax
function pinjieData(obj) {
//obj 就相當于 {key:value,key:value}
//最終拼接成鍵值對的字符串 "key:value,key:value"
var finalData = "";
for(key in obj){
finalData+=key+"="+obj[key]+""; //key:value,key:value
}
return finalData.slice(0,-1);//key:value,key:value
}
function ajax(obj) {
var url = obj.url;
var method = obj.method.toLowerCase();
var success = obj.success;
var finalData = pinjieData(obj.data);
//finalData最終的效果key:value,key:value
//1.創(chuàng)建xhr對象
var xhr = new XMLHttpRequest();
//get方法拼接地址,xhr.send(null)
if (method=='get'){
url = url + "?"+finalData;
finalData = null;
}
//2.設(shè)置請求行
xhr.open(method,url);
// 如果是post請求,要設(shè)置請求頭
if (method=='post'){
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
}
//3.發(fā)送
xhr.send(finalData);
//4.監(jiān)聽服務(wù)器返回的數(shù)據(jù)
xhr.onreadystatechange = function () {
if (xhr.status==200 xhr.readyState==4){
var result = null;
//獲取返回的數(shù)據(jù)類型
var rType = xhr.getResponseHeader("Content-Type");
if (rType.indexOf('xml')!=-1){
result = xhr.responseXML;
}else if(rType.indexOf('json')!=-1){
// JSON.parse 的意思是 將 json格式的字符串
//比如 [{ "src":"./images/nav0.png","content":"商品分類1"}]
//轉(zhuǎn)成js對象
result = JSON.parse(xhr.responseText);
}else{//當成普通的字符串去處理
result = xhr.responseText;
}
//將這里解析好的數(shù)據(jù)交給頁面去渲染
success(result);
}
}
}
jQuery中使用ajaxAPI jQuery ajax
jQuery為我們提供了更便利的ajax封裝使用.
$.ajax({}) 可以配置方式發(fā)起ajax請求
$.get() 以get方式發(fā)起ajax請求
$.post() 以post方式發(fā)起ajax請求
$('form').serialize() 序列化表單(格式化key=val$key=val)
參數(shù)說明
url :接口地址
type :請求方式(get/post)
timeout : 要求為Number類型的參數(shù),設(shè)置請求超時時間(毫秒)
dataType: 應該是客戶端傳遞給服務(wù)器一個值,告訴服務(wù)器如何進行處理:
data: 發(fā)送請求數(shù)據(jù)
beforeSend: 要求為Function類型的參數(shù),發(fā)送請求前可以修改XMLHttpRequest對象的函數(shù),例如添加自定義HTTP頭。在beforeSend中如果返回false可以取消本次ajax請求.
success: 成功響應后調(diào)用
error: 錯誤響應時調(diào)用
complete: 響應完成時調(diào)用(包括成功和失?。?br />
//ajax===get
$.ajax({
url:'',
data:'key=valuekey=value',
type:'get',
success:function (result) {
console.log(result);
}
});
//ajax===post
$.ajax({
url:'',
data:'key=valuekey=value',
type:'post',
success:function (result) {
console.log(result);
}
});
//$.get
$.get({
url:'',
data:'key=valuekey=value',
success:function (result) {
console.log(result);
}
});
//$.post
$.post({
url:'',
data:'key=valuekey=value',
success:function (result) {
console.log(result);
}
});
//在使用jQuery中ajax發(fā)送請求的時候,只需要在 dataType中寫上jsonp即可實現(xiàn)ajax的跨域請求
dataType:'jsonp'
跨域
通過XHR實現(xiàn)ajax通信的一個主要限制(相同域,相同端口,相同協(xié)議),來源于跨服安全策略,默認情況下,XHR只能請求同一域的資源,這是為了防止某些惡意的行為.
CORS跨域
CORS(cross-origin resource sharing,跨域源資源共享)定義了在跨域時,瀏覽器和服務(wù)器應該如何溝通.CORS允許一個域上的網(wǎng)絡(luò)應用向另一個域提交跨域 AJAX 請求。實現(xiàn)此功能非常簡單,只需由服務(wù)器發(fā)送一個響應標頭即可。
CORS支持所有類型的HTTP請求.
服務(wù)器端對于CORS的支持,主要就是通過設(shè)置Access-Control-Allow-Origin來進行的。
JSONP
JSONP由回調(diào)函數(shù)和數(shù)據(jù)組成.JSONP只支持GET請求.JSONP的優(yōu)勢在于支持老式瀏覽器,以及可以向不支持CORS的網(wǎng)站請求數(shù)據(jù).
JSONP通過動態(tài)script>元素來使用,src屬性知道一個跨域URL,JSONP是有效的JavaScript代碼,瀏覽器可以跨域請求JS文件.
優(yōu)點:簡單易用,可以直接訪問響應文本,支持在瀏覽器和服務(wù)器之間雙向通信.
缺點:1.JSONP是從其他域加載代碼執(zhí)行,存在不安全風險.2.不好確定JSONP請求是否成敗.
通過修改document.domain來跨子域
使用window.name來進行跨域
HTML5中新引進 window.postMessage方法來跨域傳送數(shù)據(jù)
flash
iframe
服務(wù)器設(shè)置代理頁面
圖像Ping
通過使用標簽,利用網(wǎng)頁可以從任何網(wǎng)頁加載圖像原理.
圖像Ping常用于跟蹤用戶點擊頁面或動態(tài)廣告曝光次數(shù).
2個缺點:1.只支持GET請求.2.無法訪問服務(wù)器的響應文本.只能用于瀏覽器與服務(wù)器間的單項通信.
var img = new Image();
img.onload = img.onerror = function (){
alert("Done!");
};
img.src = "";
comet
一種更高級的ajax技術(shù).ajax是頁面向服務(wù)器請求數(shù)據(jù)的技術(shù).comet是服務(wù)器向頁面推送數(shù)據(jù)的技術(shù).
SSE (Server-Sent Events) 服務(wù)器發(fā)送事件
Web Sockets
Web Sockets的目標是在一個單獨的持久鏈接上提供全雙工,雙向通信.
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 完美解決AJAX跨域問題
- jquery中ajax處理跨域的三大方式
- jquery的ajax和getJson跨域獲取json數(shù)據(jù)的實現(xiàn)方法
- 跨域請求之jQuery的ajax jsonp的使用解惑
- AJAX跨域請求json數(shù)據(jù)的實現(xiàn)方法
- jquery ajax跨域解決方法(json方式)
- Ajax實現(xiàn)跨域訪問的三種方法
- jquery ajax jsonp跨域調(diào)用實例代碼
- JQuery Ajax 跨域訪問的解決方案
- JQuery的Ajax跨域請求原理概述及實例