async javascript and xml: 異步的 JS 和 XMLjavascript
<?xml version="1.0" encoding="UTF-8"?>
<root> <student> <name>張三</name> <age>25</age> <score> <english>95</english> </score> </student> <student> <name>張三</name> <age>25</age> </student> <student> <name>張三</name> <age>25</age> </student> </root>
-------------------------
[{
"name": "張三",
"age": 25,
"score": {
"english": 95
}
}, {
"name": "張三",
"age": 25
}, {
"name": "張三",
"age": 25
}]
複製代碼
//1.建立AJAX實例
let xhr=new XMLHttpRequest; //=>IE低版本瀏覽器中用的是 new ActiveXObject() 高程三中JS惰性編程思想,關於XHR的兼容處理
//2.打開URL(配置發送請求的信息)
//METHOD:HTTP請求方式
//URL:請求地址(API接口地址)
//ASYNC:設置同步或者異步,默認是TRUE異步,FALSE同步
//USER-NAME:傳遞給服務器的用戶名
//USER-PASS:傳遞給服務器的密碼
xhr.open('GET','./json/xxx.json',true);
//3.監聽AJAX狀態,在狀態爲X的時候,獲取服務器響應的內容
//AJAX狀態碼:0 1 2 3 4
xhr.onreadystatechange=function(){
if(xhr.readyState===4 && /^(2|3)\d{2}$/.test(xhr.status)){
let result = xhr.responseText;
}
}
//4.發送請求
//SEND中放的是請求主體的內容
xhr.send(null);
=>AJAX任務(發送一個請求給服務器,從服務器獲取到對應的內容)從SEND後開始,到XHR.READYSTATE===4的時候算任務結束
複製代碼
=>真實項目中用對應的請求方式,會使請求變的更加明確(語義化),不遵循這些方式也能夠,最起碼瀏覽器在語法上是容許的;可是這些是開發者們相互間約定俗成的規範;html
GET系列通常用於從服務器獲取信息,POST系列通常用於給服務器推送信息,可是不論GET和POST均可以把信息傳遞給服務器,也能從服務器獲取到結果,只不過是誰多誰少的問題java
GET系列傳遞給服務器信息的方式通常採用:問號傳參 POST系列傳遞給服務器信息的方式通常採用:設置請求主體jquery
xhr.open('GET','/list?name=zhufeng&year=10&xxx=xxx...')
xhr.send('....') 請求主體中傳遞的內容理論上沒有大小限制,可是真實項目中,爲了保證傳輸的速度,咱們會本身限制一些
複製代碼
//=>解決辦法設置隨機數
xhr.open('GET','/list?name=zhufeng&_='+Math.random());
...
xhr.open('GET','/list?name=zhufeng&_='+Math.random());
複製代碼
xhr.readyState 獲取狀態碼ajax
<script>
let xhr = new XMLHttpRequest;
// console.log(xhr.readyState); //=> 0
xhr.open('GET', 'json/data.json');
// console.log(xhr.readyState); //=>1
xhr.onreadystatechange = function () {
// console.log(xhr.readyState); //=>2 3 4
if (!/^(2|3)\d{2}$/.test(xhr.status)) return;
if (xhr.readyState === 2) {
//=>獲取響應頭信息
//獲取的服務器時間是標準的日期格式對象(GMT格林尼治時間)
//new Date()能把格林尼治時間轉換爲北京時間
let serverTime = xhr.getResponseHeader('Date');
// console.log(new Date(serverTime));
}
if (xhr.readyState === 4) {
//=>獲取響應主體信息:咱們通常用responseText,由於服務器返回的信息通常都是JSON格式的字符串,若是返回的是XML格式,咱們用responseXML...
// xhr.responseXML
// xhr.response
// xhr.responseType
// console.log(xhr.responseText);
}
}
xhr.send(null);
</script>
複製代碼
<script>
//=>AJAX任務的異步
let xhr = new XMLHttpRequest;
xhr.open('GET', 'json/data.json');
//=>設置事件綁定以前狀態1
xhr.onreadystatechange = function () {
console.log(xhr.readyState); //=>2 3 4
}
xhr.send(null);
let xhr = new XMLHttpRequest;
xhr.open('GET', 'json/data.json');
xhr.send(null);
xhr.onreadystatechange = function () {
console.log(xhr.readyState); //=>2 3 4
}
//=>AJAX的同步/**/
let xhr = new XMLHttpRequest;
xhr.open('GET', 'json/data.json', false);
xhr.onreadystatechange = function () {
console.log(xhr.readyState); //=>4 使用AJAX同步編程,不能在狀態碼爲2的時候獲取到響應頭的信息,可是狀態碼爲4的時候也是能夠獲取到頭和主體信息
}
xhr.send(null);
let xhr = new XMLHttpRequest;
xhr.open('GET', 'json/data.json', false);
xhr.send(null);//=>執行後,只有狀態碼爲4纔會繼續處理下面的代碼
//=>狀態碼爲4的時候綁定的,而狀態不會在變了,因此方法不會執行
xhr.onreadystatechange = function () {
console.log(xhr.readyState);
}
// API:Application Programming Interface 凡是可被別人調用,而且給予反饋結果的均可以被稱之爲API接口
</script>
複製代碼
<script>
let xhr = new XMLHttpRequest;
// xhr.timeout = 10; //=>設置AJAX等待時間,超過這個時間算AJAX延遲
// xhr.ontimeout = function () {
// console.log('請求超時~~');
// xhr.abort(); //=>手動中斷AJAX的請求
// }
// xhr.withCredentials = true; //=>在跨域請求中是否容許攜帶證書(攜帶COOKIE)
xhr.open('GET', 'json/data.json');
//=>設置請求頭信息
// xhr.setRequestHeader('AAA', encodeURIComponent('珠峯培訓'));
// Uncaught TypeError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': Value is not a valid ByteString. 設置的請求頭信息值不能是中文
xhr.onreadystatechange = function () {
if (!/^(2|3)\d{2}$/.test(xhr.status)) return;
if (xhr.readyState === 4) {
console.log(xhr.responseText);//-> {"code":63732359.6050773,"data":[{"name":"laborum velit reprehenderit et adipisicing"},{"name":"sed occaecat dolore"}]}
}
}
xhr.send(null);
</script>
複製代碼
阻塞代碼加編程
延遲加載時間,性能低json
【屬性】後端
xhr.response 響應主體內容api
xhr.responseText 響應主體的內容是字符串(JSON或者XML格式字符串均可以)跨域
xhr.responseXML 響應主體的內容是XML文檔
xhr.status 返回的HTTP狀態碼
xhr.statusText 狀態碼的描述
xhr.timeout 設置請求超時的時間
xhr.withCredentials 在跨域請求中是否容許攜帶證書(攜帶COOKIE)
【方法】
<script src="js/jquery.min.js"></script>
<script>
/* * $.ajax() 基於原生JS的AJAX四步操做進行封裝 * $.ajax([URL],[OPTIONS]) * $.ajax([OPTIONS]) URL在配置項中(推薦) * $.get/post/getJSON/getScript() * ...... * 配置項信息 * url:請求的API接口地址 * method:HTTP請求方式,默認GET * data:傳遞給服務器的信息,默認null(能夠是字符串,能夠是對象,並且若是GET系列請求,JQ會自動把信息拼接到URL的末尾,基於問號傳參傳遞給服務器;若是是POST請求,JQ會基於請求主體,把信息傳遞給服務器) * dataType:預設服務器返回的結果格式(服務器返回的通常都是JSON格式的字符串,若是咱們設置了DATA-TYPE,JQ會根據設置的類型,把服務器返回的結果處理爲對應的格式),支持的內容text / json / xml / html / script / jsonp(跨域) =>不影響服務器返回的結果,只是把服務器返回的結果進行二次處理 * async:是否爲異步操做,默認是TRUE,表明異步操做 * cache:緩存處理,只對GET系列請求有做用,默認是TRUE不處理緩存,當咱們設置FALSE後,JQ幫咱們在URL的末尾設置一個隨機數 * contentType:設置傳遞給服務器內容的格式類型 默認是"application/x-www-form-urlencoded" * 客戶端傳遞給服務器信息的格式(類型通常都是字符串),經常使用的: * form-data表單數據:JSON格式 '{"name":"xxx","lx":1}' * x-www-form-urlencoded:name=xxx&lx=1 * raw:純文本格式 * headers:設置請求頭信息,他是一個對象 * timeout:設置超時的時間 * success:回調函數,當數據請求成功執行,方法中的參數就是從服務器獲取的結果 * error:回調函數,數據請求失敗執行,方法中的參數是錯誤信息 */
$.ajax({
url: 'http://yapi.demo.qunar.com/mock/95100/project/list',
method: 'POST',
data: {
name: 'zhufeng',
lx: 'teacher'
},
dataType: 'json',
async: true,
cache: false,
headers: {},
success: (result, status, xhr) => {
//=>xhr:是JQ幫咱們處理過的AJAX實例
console.log(result, status, xhr);
}
});
</script>
複製代碼