整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript封裝一個自己的Ajax并完善與拓展Ajax

          在所有主流的網站,基本上都用到了ajax技術,通過異步請求數據已經是一個很普及的實現方式。市面上主流的web前端框架也都有自己封裝的ajax,而且都是大同小異的。也就是說,Ajax這個輪子已經是多的不能再多了,那為什么我們還要自己封裝一個Ajax呢?

          想要了解一個技術或者某個功能的實現原理,只有動手實踐才能真正的了解。就如我在csdn上第一篇博客的博文描述。探索技術的路上本應該自己造輪子,即使市面上有再多的選擇,自己動手嘗試也是必要的,第一次嘗試必然會問題眾多,但你不覺得解決他是一件很有成就感的事情嗎,這樣才能帶給你更大的進步和更深刻的領悟。

          廢話不說,先來寫一個最基礎的ajax:

          [javascript] view plain copy

          1. function ajax(a){
          2. var ajax = new XMLHttpRequest();
          3. ajax.onreadystatechange = function(){
          4. if (ajax.readyState == 4 && ajax.status == 200) {
          5. a.success(JSON.stringify(ajax.responseText))
          6. }
          7. }
          8. ajax.open(a.method, a.url,true)
          9. ajax.send(a.data)
          10. }
          11. ajax({
          12. method:'get',
          13. url:'http://127.0.0.1:8081/test',
          14. success:function(res){
          15. console.log(res)
          16. }
          17. })

          一個ajax出爐了,通過調用、填寫參數即可請求到服務器。先來分析一下這個ajax的結構,可以看得出來,其實很簡單,只是new了一個XMLHttpRequest對象,然后通過onreadystatechange方法來處理返回值,現在我們只是做了一個判斷,當請求成功時就調用success方法,如果請求失敗,我們還沒有寫上去,后面我們慢慢完善這個ajax的邏輯。

          然后調用ajax的open方法,open方法里有三個參數,第一個是請求方式(如:get或post),第二個是請求的url地址,第三個是一個bool值,是否要異步請求。

          最后使用send方法帶上參數發送請求即可。

          這是,我的服務器已經收到一個請求,但他報了404錯誤,也就是找不到對應的頁面或路由,這時success方法也不會被調用執行。

          那我們再來完善一下這個新生的ajax。我們只需要在onreadystatechange方法里增加一個條件,當請求不成功時調用自身的error方法:

          [javascript] view plain copy

          1. ajax.onreadystatechange = function(){
          2. if (ajax.readyState == 4 && ajax.status == 200) {
          3. a.success(JSON.stringify(ajax.responseText))
          4. }else{
          5. a.error(ajax)
          6. }
          7. }

          這樣我們就可以在ajax請求的時候加上error方法,當ajax請求失敗的時候執行我們想要執行的操作。現在我們拋除跨域請求的問題,當你發送post請求時,你會發現后臺接收不到傳過來的參數,調用如下:

          [javascript] view plain copy

          1. ajax({
          2. method:'get',
          3. url:'http://localhost:8081/test',
          4. data:'a=1',
          5. success:function(res){
          6. console.log(res)
          7. },
          8. error:function(res){
          9. console.log(res)
          10. }
          11. })

          后端打印一下傳過來的參數,為空。

          出現這個問題的原因主要是請求頭沒有聲明,這時候我們需要初始化聲明一下請求頭,那我們加入一行代碼:

          [javascript] view plain copy

          1. ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

          設置Conten-type為application/x-www-form-urlencoded,現在后端應該是已經可以收到參數了。那我們現在的ajax調用時實在太繁瑣,有些東西我們不想填的我們應該給他設置一個默認值,不然就會報錯。

          比如error方法、method、還有是否異步的bool值等等。那我們再加入一些默認值,現在的ajax是這樣的:

          [javascript] view plain copy

          1. function ajax(a){
          2. a.method = a.method || 'get';
          3. a.ajax = a.ajax || true;
          4. a.error = a.error || function(){
          5. console.warn('Ajax請求失敗');
          6. };
          7. var ajax = new XMLHttpRequest();
          8. ajax.onreadystatechange = function(){
          9. if (ajax.readyState == 4 && ajax.status == 200) {
          10. a.success(JSON.stringify(ajax.responseText))
          11. }else{
          12. a.error(ajax)
          13. }
          14. }
          15. ajax.open(a.method, a.url,a.ajax)
          16. ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
          17. ajax.send(a.data)
          18. }

          現在的ajax還存在一個問題,在post請求的時候,如果我們要傳參,是需要通過字符串傳參的。那這種的書寫規則并不是很友好的:

          [javascript] view plain copy

          1. a=1&b=2

          而一般框架的傳參都是通過json的格式來輸入的,我們也不能偏離大眾習慣搞獨立,當然我們也要保留字符串的傳參方式,只是要擴展功能。

          那我們需要加一個控制格式的參數,我們這里用dataType這個參數來控制傳參格式,默認是字符串格式傳參好了,可以選擇json格式進行傳參即可。如果是json格式傳參,我們需要把json轉化成字符串類型,代碼如下:

          [javascript] view plain copy

          1. a.dataType = a.dataType || 'string';
          2. var data = a.data;
          3. if (a.dataType == 'json') {
          4. var nowData = "";
          5. for (var i in data) {
          6. nowData += (nowData != ''?'&':'')+i+'='+data[i];
          7. }
          8. data = nowData;
          9. }

          這樣,我們的ajax也就可以通過json格式進行傳參了。現在的ajax完整代碼和調用方式如下:

          [javascript] view plain copy

          1. function ajax(a){
          2. a.method = a.method || 'get';
          3. a.ajax = a.ajax || true;
          4. a.dataType = a.dataType || 'string';
          5. a.error = a.error || function(){
          6. console.warn('Ajax請求失敗');
          7. };
          8. var ajax = new XMLHttpRequest();
          9. ajax.onreadystatechange = function(){
          10. if (ajax.readyState == 4 && ajax.status == 200) {
          11. a.success(JSON.stringify(ajax.responseText))
          12. }else{
          13. a.error(ajax)
          14. }
          15. }
          16. var data = a.data;
          17. if (a.dataType == 'json') {
          18. var nowData = "";
          19. for (var i in data) {
          20. nowData += (nowData != ''?'&':'')+i+'='+data[i];
          21. }
          22. data = nowData;
          23. }
          24. ajax.open(a.method, a.url,a.ajax)
          25. ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
          26. ajax.send(data)
          27. }
          28. //調用Ajax示例
          29. ajax({
          30. method:'post',
          31. url:'http://localhost:8081/test',
          32. dataType:'json',
          33. data:{
          34. a:'1',
          35. b:'2'
          36. },
          37. success:function(res){
          38. console.log(res)
          39. }
          40. })

          現在這個Ajax基本上已經可以滿足業務上的所以需求,不過還有一點沒有實現,我們的Ajax不能設置請求頭?!為了一些特殊需求的情況下,我們還是要把這一功能加上的:

          [javascript] view plain copy

          1. if (a.requestHeader) {
          2. for (var i in a.requestHeader) {
          3. ajax.setRequestHeader(i,a.requestHeader[i])
          4. }
          5. }

          現在的完整代碼入下:

          [javascript] view plain copy

          1. function ajax(a){
          2. a.method = a.method || 'get';
          3. a.ajax = a.ajax || true;
          4. a.dataType = a.dataType || 'string';
          5. a.error = a.error || function(){
          6. console.warn('Ajax請求失敗');
          7. };
          8. var ajax = new XMLHttpRequest();
          9. ajax.onreadystatechange = function(){
          10. if (ajax.readyState == 4 && ajax.status == 200) {
          11. a.success(JSON.parse(ajax.responseText))
          12. }else if (ajax.readyState != 4 && ajax.status != 200){
          13. a.error(ajax)
          14. }
          15. }
          16. var data = a.data;
          17. if (a.dataType == 'json') {
          18. var nowData = "";
          19. for (var i in data) {
          20. nowData += (nowData != ''?'&':'')+i+'='+data[i];
          21. }
          22. data = nowData;
          23. }
          24. ajax.open(a.method, a.url,a.ajax)
          25. if (a.requestHeader) {
          26. for (var i in a.requestHeader) {
          27. ajax.setRequestHeader(i,a.requestHeader[i])
          28. }
          29. }
          30. ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
          31. ajax.send(data)
          32. }

          完整示例代碼文件:JavaScript封裝Ajax完整示例代碼

          Ajax的底層是如何實現,這里只研究了post和get的實現方式。這里的代碼比較簡單,主要是編寫JavaScript模仿Ajax異步實現請求數據,加深對Ajax的理解,有需要的會注釋上。歡迎一起交流.

          內容

          jsp表單

          <form action="" method="post" onsubmit="return checkDB()">

          name:<input id="name" name="name" type="text">

          <br/>

          password:<input id="pass" name="pass" type="text">

          <br/>

          <br/>

          <input type="submit" onclick="check()" value="submit">

          <br/>

          <p style="visibility: hidden" id="putError">用戶名或密碼錯誤</p>

          <br/>

          </form>

          解釋函數的作用:check()檢查用戶名或密碼是否為空(即是否未輸入數據),checkDB()通過JavaScript原生態Ajax和后端進行校驗,用戶名和密碼是否正確。

          JavaScript實現

          <script type="text/javascript">

          var Ajax={

          get:function (url,fun) {

          var obj = new XMLHttpRequest();

          obj.open('GET', url, true);

          obj.onreadystatechange = function () {

          if(obj.status==200 && obj.readyState==4) {

          fun.call(this, obj.responseText)

          }

          };

          obj.send(null);

          },

          post : function (url,data,fun) {

          var obj = new XMLHttpRequest();

          obj.open('POST', url, true);

          obj.onreadystatechange = function() {

          if(obj.status==200 || obj.readyState==4) {

          fun.call(this, obj.responseText)

          }

          };

          obj.send(data);

          }

          };

          </script>

          <script type="text/javascript">

          function check() {

          var name = document.getElementById("name").value;

          var pass = document.getElementById("pass").value;

          alert(name);

          if(name == ""|| name==null || pass==null || pass == ""){

          alert("用戶名或密碼沒有輸入!");

          return false;

          }

          }

          function checkDB(){

          var name = document.getElementById("name").value;

          var pass = document.getElementById("pass").value;

          var data = {"name": name, "pass": pass};

          Ajax.post('demo',data,putError);

          }

          function putError(data) {

          if(data=="error"){

          document.getElementById("putError").style.visibility = "visible";

          return false;

          }

          }

          </script>

          請求的demo會被MyServlet類攔截。這里var Ajax定義為一個數組,這個數組是一個鍵值對,鍵是get post 而值是一個函數,這個函數先一步,對數據進行校驗。

          Servlet實現

          public class MyServlet extends HttpServlet {

          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          User user = new User("xiaoming", "666");

          String name = request.getParameter("name");

          String pass = request.getParameter("pass");

          if (user.getName().equals(name) && user.getPass().equals(pass)){

          response.getWriter().write("succ");

          }

          else{

          response.getWriter().write("error");

          }

          }

          }

          TML+AJAX實現上傳大文件方案,h5批量下載文件,HTTP+斷點續傳,前端處理大文件/視頻分片上傳,斷點續傳,VUE—實現文件上傳(多文件),圖片上傳,VUE 項目大文件上傳下載解決方案,VUE將前端的JSON文件上傳到后臺對應目錄,

          JAVASCRIPT之分片上傳,斷點續傳的實際項目實現詳解,大文件上傳如何做斷點續傳?全端+后端結合開發,VUE實現文件上傳(單文件、多文件、分片上傳),JS中實現文件上傳下載的三種解決方案(推薦),JS實現大文件上傳——分片上傳方法,完美解決WEB無法上傳大文件方法,HTML大文件上傳源碼,

          WEBUPLOAD組件實現文件上傳功能和下載功能,js大文件上傳下載解決方案,vue大文件上傳下載解決方案

          asp.net大文件上傳下載解決方案,.net大文件上傳下載解決方案,webform大文件上傳下載解決方案,jsp大文件上傳下載解決方案,java大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載切片解決方案,JAVASCRIPT 大文件上傳下載切割解決方案,JAVASCRIPT 大文件上傳下載分割解決方案,JAVASCRIPT 大文件上傳下載分塊解決方案,JAVASCRIPT 大文件上傳下載分片解決方案,web大文件上傳下載解決方案,

          網頁大文件上傳下載解決方案,前端大文件上傳下載解決方案,html5大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載解決方案,支持

          之前在網上也找過相關的資料,論壇上也有網友交流過,但是基本上都不太令人滿意,與公司這邊的項目需求相差太遠。

          HTML5,VUE2,VUE3,React,javascript等常用前端UI框架,JS框架,網上找的方案大多數都只是一些代碼片段,沒有提供完整的前后端代碼。

          原理到是不復雜。上傳位置不能傳錯。用戶主要強調穩定性和兼容性。

          之前在網上也搜過相關的資料。論壇里面也有一些網絡交流,但是都不太令人滿意。公司這邊實際上需要的是一成熟的商業解決方案,需要能夠提供成功案例,公司客戶都是國企。

          跟項目經理溝通過,這塊網上搜到的文章能用的幾乎沒有。實際上客戶那邊比較在乎兩點。

          之前項目上面用Flash比較多一點,現在基本上都是HTML5,斷點續傳除了頁面級以外最好還能夠提供離線支持。

          支持IE,Chrome和信創國產化環境,比如銀河麒麟,統信UOS,龍芯,

          支持分片,分塊,分段,切片,分割上傳。能夠突破chrome每域名的5個TCP連接限制,能夠突破chrome重啟,關閉瀏覽器續傳的限制。

          支持10G,20G,50G,100G文件上傳和續傳,支持秒傳,支持文件夾上傳,重復文件檢測,重復文件校驗

          支持文件下載,批量下載,下載斷點續傳,加密下載,端到端加密,加密算法支持國密SM4,多線程下載

          支持在服務端保存文件夾層級結構,支持將文件夾層級結構信息保存到數據庫中,支持下載時能夠將文件夾層級結構下載下來,支持下載文件夾,下載文件夾支持斷點續傳,

          支持加密傳輸,包括加密上傳,加密下載,加密算法支持國密SM4,

          支持云對象存儲,比如華為云,阿里云,騰訊云,七牛云,AWS,MinIO,FastDFS,

          提供手機,QQ,微信,郵箱等聯系方式,提供7*24小時技術支持,提供長期技術支持和維護服務,提供遠程1對1技術指導,提供二次開發指導,提供文檔教程,提供視頻教程。1.下載示例

          https://gitee.com/xproer/up6-vue-cli



          將up6組件復制到項目中

          示例中已經包含此目錄



          1.引入up6組件



          2.配置接口地址

          接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表

          參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



          3.處理事件



          啟動測試



          啟動成功



          效果



          數據庫



          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc


          主站蜘蛛池模板: 国产A∨国片精品一区二区| 亚洲一区二区三区国产精品| 一区二区三区视频| 一区二区三区电影网| 无码国产精品一区二区免费式直播| 精品国产一区二区三区在线 | 亚洲日韩一区精品射精| 国产在线一区二区视频| 亚洲AV无码一区二区三区鸳鸯影院| 日本成人一区二区三区| 亚洲国产韩国一区二区| 亚洲午夜一区二区三区| 国产一区二区三区四| 国产成人无码精品一区二区三区| 国产乱码精品一区二区三区中 | 丰满少妇内射一区| 少妇一晚三次一区二区三区| 在线欧美精品一区二区三区| 亚洲爆乳精品无码一区二区三区| 日韩美女视频一区| 免费一区二区三区四区五区| 精品国产日韩亚洲一区在线| 91精品福利一区二区| 亚拍精品一区二区三区| 精品人妻少妇一区二区| 成人国产一区二区三区| 亚洲综合无码AV一区二区| 国产精品无码一区二区三级| 国精产品一区一区三区有限公司| 色婷婷AV一区二区三区浪潮| 国产av一区最新精品| 综合人妻久久一区二区精品| 精品国产一区二区麻豆| 亚洲欧美日韩一区二区三区| 亚洲综合色一区二区三区| 久久人妻内射无码一区三区| 一夲道无码人妻精品一区二区 | 天堂va视频一区二区| 3d动漫精品一区视频在线观看| 亚洲综合色自拍一区| 国产成人无码精品一区二区三区|