摘要:內部怎么實現的使用一個文件來模擬服務器返回,代碼如下請求的發送實際上我們都通過瀏覽器的實現,使用,不考慮的兼容,我們實現一個簡單的請求如下。
ajax ajax內部怎么實現的?
使用一個php文件來模擬服務器返回,php代碼如下
請求的發送實際上我們都通過瀏覽器的XMLHttpRequest實現,ie6使用ActiveXObject,不考慮IE6的兼容,我們實現一個簡單的xhr請求如下。
xhr.readyState狀態值
0:剛剛創建初始狀態 1:已連接 2:已發送 3:已接受-頭(32k上限) 4:已接受-body(1G上限)http狀態碼
1XX 消息 2XX 成功 3XX 重定向 301 永久重定向——瀏覽器永遠不會再次請求老的地址 302 臨時重定向——瀏覽器下次還會請求老地址 304 (not modified)重定向到緩存請求——因此304也是成功 4XX 請求錯誤,客戶端錯誤 5XX 服務端錯誤 6XX 擴展錯誤碼
因此可以通過2XX和304的狀態碼判斷請求成功。
// 接收;4代表結束 xhr.onreadystatechange = function(){ if (xhr.readyState ==4){ if ((xhr.status>=200&&xhr.status<300)||xhr.status==304){ alert("成功:"+xhr.responseText); console.log(xhr); } else { alert("失敗"); } } };xhr返回值
xhr.responseText 文本數據
xhr.responseXML XML數據(已經不常用)
xml數據是不固定標簽組成的數據,xml數據更加占空間,例如:
xiaoyezi 18 front engineer
json格式:
let json={name:"xiaoyezi",age:18,job:"front engineer"};XMLHttpRequest發送POST請求
按照我們上面代碼的思路,post請求的寫法推導出來應該是如下寫法,實際上如下寫法并不行。
// 連接,true代表異步,false代表同步;瀏覽器對異步的xhr會報錯 xhr.open("post","../server/a.php",true,); // 發送;send里面是body,post需要發送 xhr.send("a=12&b=5");
對比form的post提交方式,我們可以看到,Request Headers里面有條設置和form提交的不同:
Content-Type: text/plain;charset=UTF-8 form提交:Content-Type: application/x-www-form-urlencoded
需要增加setRequestHeader的設置,再send請求的body內容,請求成功。
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send("a=12&b=5");
text/plain 文本 application/x-www-form-urlencoded &&&連接的方式,eg:a=12&b=5 multippart/form-data 定界符分割各個數據(文件上傳)實現簡單的自定義ajax
function ajax(options){ // 數據處理 options = options || {}; options.data = options.data || {}; options.type = options.type || "get"; options.dataType = options.dataType || "text"; //解析數據 let arr = []; for (let name in options.data) { arr.push(`${name}=${encodeURIComponent(options.data[name])}`); } let dataStr = arr.join("&"); // 不兼容ie6 let xhr=new XMLHttpRequest(); // 連接,true代表異步,false代表同步;瀏覽器對異步的xhr會報錯 if (options.type == "get"){ xhr.open("get",options.url + "?" + dataStr,true); xhr.send(); } else { xhr.open("post",options.url,true,); // 發送;send里面是body,post需要發送Content-Type xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send(dataStr); } // 接收;4代表結束 xhr.onreadystatechange = function(){ if (xhr.readyState ==4){ if ((xhr.status>=200&&xhr.status<300)||xhr.status==304){ let result = xhr.responseText; switch (options.dataType){ case "text": break; case "json": if (window.JSON && JSON.parse){ result = JSON.parse(result); } else { result = eval("("+result+")"); } break; case "xml": result = xhr.XMLHttpRequest; break; default: break; } options.success && options.success(result); } else { options.error && options.error("error"); } } }; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95610.html
摘要:示例運行函數彈出彈出函數接收參數,返回值。其中,返回一個對象,是的返回值,代表函數是否執行完成。 ES6特性介紹(下) ES6新的標準,新的語法特征:1、變量/賦值2、函數3、數組/json4、字符串5、面向對象6、Promise7、generator8、ES7:async/await 《【Web全棧課程二】ES6特性介紹(上)》見:https://segmentfault.com/a...
摘要:借鑒圖片僅用于學習分享,請尊重原創作者,勿用于商用。這其中最關鍵的一步就是從服務器獲得請求數據。基本步驟創建對象也就是創建一個異步調用對象。創建一個新的請求并指定該請求的方法及驗證信息。設置響應請求狀態變化的函數。使用和實現局部刷新。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解...
摘要:借鑒圖片僅用于學習分享,請尊重原創作者,勿用于商用。這其中最關鍵的一步就是從服務器獲得請求數據。基本步驟創建對象也就是創建一個異步調用對象。創建一個新的請求并指定該請求的方法及驗證信息。設置響應請求狀態變化的函數。使用和實現局部刷新。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解...
閱讀 3428·2021-11-19 09:40
閱讀 1314·2021-10-11 11:07
閱讀 4844·2021-09-22 15:07
閱讀 2890·2021-09-02 15:15
閱讀 1964·2019-08-30 15:55
閱讀 539·2019-08-30 15:43
閱讀 883·2019-08-30 11:13
閱讀 1449·2019-08-29 15:36