報告,我要說話! xp被歷史淘汰了,IE6 say goodbye了,太TM開心了,從此不要兼容IE6了,哈哈哈哈哈哈
報告,我要說話! IE這sb為啥不早點被殺呢,找工作聽說要兼容IE,立刻軟了,唉唉唉唉唉
報告,我要說話! Jquery太豐富了,老子只用了幾個功能,媽的,太不划算了,啊啊啊啊啊啊
......
好了,言歸正傳。對於想到整理ajax設計方案,原因如下:
從資源合理利用的角度以及網站優化角度去想,每次為了那幾個功能,去引用一個框架,不划算
拜讀了w3c的ajax的設計方案,包括level1和level2的規範,有種豁然開朗的感覺
有朋友遇到ajax的跨域方案,各種糾結在心裡,導致內心不能舒暢
自己的框架底層也要需要用到ajax的基礎功能,(get post請求,對於level2的上傳暫時沒用到)
最關鍵的也是之前對這塊概念十分模糊,所以開始整理ajax這塊的設計方案
介紹一些概念:
介紹一些概念:
介紹一些概念:
介紹一些概念:
〜端可以在傳送服務端的情況下;
支援發送和接收二進位資料;
新增formData對象,支援傳送表單資料;
發送和取得資料時,可以取得時間點填相容性如下:
nginx:是一個高效能的HTTP和反向代理伺服器IIS:微軟開發的伺服器,window系統自帶 開始準備如下:純nginx反向代理伺服器(前後端分離用)後台2套介面(連接埠:1122,連接埠:2211) PS:一份必須支援跨網域請求IIS伺服器(部署後台介面)插件postman (介面測試)IE、chrome、firefox、Opera、safari、edge 6大瀏覽器,做相容性測試 XMLHttpRequest傳送請求步驟:實例化XMLHttpRequest(IE996p ('Microsoft.XMLHTTP'))取得一個實例透過實例open一個請求,設定發送類型和介面以及同異步如有需要配置報文,以及各種事件(success,error,timeout等)呼叫實例的send方法,發送http/https的請求伺服器回調,客戶端接收,並做回應處理 程式碼關鍵點如下:
//创建xhr对象 var xhr = createXhrObject(); //针对某些特定版本的mozillar浏览器的BUG进行修正 xhr.overrideMimeType?(xhr.overrideMimeType("text/javascript")):(null); //针对IE8的xhr做处理 PS:ie8下的xhr无xhr.onload事件,所以这里做判断 xhr.onload===undefined?(xhr.xhr_ie8=true):(xhr.xhr_ie8=false); //参数处理(get和post),包括xhr.open get:拼接好url再open post:先open,再设置其他参数 ajaxSetting.data === ""?(null):(xhr = dealWithParam(ajaxSetting,this,xhr)); //设置超时时间(只有异步请求才有超时时间) ajaxParam.async?(xhr.timeout = ajaxSetting.time):(null); //设置http协议的头部 each(ajaxSetting.requestHeader,function(item,index){xhr.setRequestHeader(index,item)}); //判断并设置跨域头部信息 (ajaxSetting.crossDomain)?(xhr = addCoreHeader(xhr,ajaxSetting)):(null); //onload事件(IE8下没有该事件) xhr.onload = function(e) { if(this.status == 200||this.status == 304){ ajaxSetting.dataType.toUpperCase() == "JSON"?(ajaxSetting.success(JSON.parse(xhr.responseText))):(ajaxSetting.success(xhr.responseText)); }else{ /* * 这边为了兼容IE8、9的问题,以及请求完成而造成的其他错误,比如404等 * 如果跨域请求在IE8、9下跨域失败不走onerror方法 * 其他支持了Level 2 的版本 直接走onerror * */ ajaxSetting.error(e.currentTarget.status, e.currentTarget.statusText); } }; //xmlhttprequest每次变化一个状态所监控的事件(可拓展) xhr.onreadystatechange = function(){ switch(xhr.readyState){ case 1://打开 //do something break; case 2://获取header //do something break; case 3://请求 //do something break; case 4://完成 //在ie8下面,无xhr的onload事件,只能放在此处处理回调结果 xhr.xhr_ie8?((xhr.status == 200 || xhr.status == 304)?(ajaxSetting.dataType.toUpperCase() == "JSON"?(ajaxSetting.success(JSON.parse(xhr.responseText))):(ajaxSetting.success(xhr.responseText))):(null)):(null); break; }; }; //ontimeout超时事件 xhr.ontimeout = function(e){ ajaxSetting.timeout(999,e?(e.type):("timeout")); //IE8 没有e参数 xhr.abort(); //关闭请求 }; //错误事件,直接ajax失败,而不走onload事件 xhr.onerror = function(e){ ajaxSetting.error(); }; xhr.send((function(result){this.postParam == undefined?(result =null):(result=this.postParam);return result;})(this.postParam));測試程式碼如下:前端測試程式碼
ajax.post("/api/ajax1/ajaxT1/",{"name":"测试异步post请求","age":"success"},function(data){alert(data)}); //该接口在1122上
後端跨域介面碼
ajax.post_cross("http://192.168.0.3:2211/api/weixin/ajaxT2/",{"name":"测试跨域post请求","age":"success"},function(data){alert(data)});
後端跨域介面碼
/// <summary> /// 测试跨域请求 /// </summary> /// <param name="module"></param> /// <returns></returns> [Route("ajaxT2")] public String kuaAjaxT2([FromBody]TModule module) { String result = "跨域post传输成功:"+module.name+"-"+module.age; return result; }
下面是各種瀏覽器的測試結果(僅提供同源post請求和跨域post請求):
同源測試:
chrome
IE8-9
🎜🎜opera🎜🎜🎜🎜🎜safari🎜edge
跨域測試:
chrome
firefox operasafari edge 具體程式碼已封裝成一個js庫,供大家根據專案需求,自己開發客製化,不過我已經封裝了一些請求: ajax。 -- ajax.post_cross
通用設定請求 -- ajax.common
程式碼和測試頁面已上傳github,後台介面如果大家想測試的話,就自己寫一個把,後台壓縮程式碼就不上傳了,關鍵碼完了只有4K!