什麼!你想要封裝好的ajax
- 2020 年 6 月 6 日
- 筆記
- javascript, 性能優化
ajax作為前端開發領域一個必不可少的內容,也是靈魂所在,今天就ajax的封裝給大家做一個分析, 如果沒有猜錯的話現在基本上用原生去寫ajax的意見不多了,這是肯定的 ,為什麼這麼說,jq的ajax大家肯定都很熟悉不過了前兩年又出來的axios,因其簡潔的語法與受到vue作者的青睞,一度熱度居高不下,基本滿足所有的請求,本質上也是對原生XHR的封裝,只不過它是Promise的實現版本,符合最新的ES規範,它本身具有以下特徵: 1.從瀏覽器中創建 XMLHttpRequest 2.支援 Promise API 3.客戶端支援防止CSRF 4.提供了一些並發請求的介面(重要,方便了很多的操作) 5.從 node.js 創建 http 請求 6.攔截請求和響應 7.轉換請求和響應數據 8.取消請求 9.自動轉換JSON數據 PS:防止CSRF:就是讓你的每個請求都帶一個從cookie中拿到的key, 根據瀏覽器同源策略,假冒的網站是拿不到你cookie中得key的,這樣,後台就可以輕鬆辨別出這個請求是否是用戶在假冒網站上的誤導輸入,從而採取正確的策略。
廢話不多說今天分析下封裝的過程幾原理:
function ajax(){ var ajaxData = { type: (arguments[0].type || "GET").toUpperCase(), url: arguments[0].url || "", async: arguments[0].async || "true", data: arguments[0].data || null, dataType: arguments[0].dataType || "json", contentType: arguments[0].contentType || "application/x-www-form-urlencoded; charset=utf-8", beforeSend: arguments[0].beforeSend || function(){}, success: arguments[0].success || function(){}, error: arguments[0].error || function(){} } ajaxData.beforeSend() var xhr = createxmlHttpRequest(); xhr.responseType=ajaxData.dataType; xhr.open(ajaxData.type,ajaxData.url,ajaxData.async); xhr.setRequestHeader("Content-Type",ajaxData.contentType); xhr.send(convertData(ajaxData.data)); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if(xhr.status == 200){ ajaxData.success(xhr.response) }else{ ajaxData.error() } } } } function createxmlHttpRequest() { if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { return new XMLHttpRequest(); } } function convertData(data){ if( typeof data === 'object' ){ var convertResult = "" ; for(var c in data){ convertResult+= c + "=" + data[c] + "&"; } convertResult=convertResult.substring(0,convertResult.length-1) return convertResult; }else{ return data; } } ajax({ type:"POST", url:"ajax.php", dataType:"json", data:{ "name":"abc", "age":123, "id":"456" }, beforeSend:function(){ //some js code }, success:function(msg){ console.log(msg) }, error:function(){ console.log("error") } })
幾點說明: IE7及其以上版本中支援原生的 XHR 對象,因此可以直接用: var oAjax = new XMLHttpRequest(); IE6及其之前的版本中,XHR對象是通過MSXML庫中的一個ActiveX對象實現的。使用下面的語句創建: var oAjax=new ActiveXObject(』Microsoft.XMLHTTP』); GET 請求方式是通過URL參數將數據提交到伺服器的,POST則是通過將數據作為 send 的參數提交到伺服器;POST 請求中,在發送數據之前,要設置表單提交的內容類型;
//可以以下步驟代替上面的open、setRequestHeader、send三行,此處對GET和POST做了很好的區分 var params = {}; for(var key in ajaxData.data){ params.push(key + "=" + ajaxData.data[key]); } var sendData = params.join("&"); if(ajaxData.type.toUpperCase() == "GET"){ xhr.open(ajaxData.type, ajaxData.url + "?" + sendData, ajaxData.async); xhr.send(null); }else{ xhr.open(ajaxData.type, ajaxData.url, ajaxData.async); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8"); xhr.send(sendData); }
基本上內容都在這兒了 這個過程也是ajax基本的工作原理了,今天的知其然知其所以然環節就到這裡,感謝南歌子提供的靈感