Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产精品久久久久久久久免费观看 ,韩国无遮挡三级伦在线大全,免费国产成人手机在线观看

          整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

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

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

          想要了解一個技術或者某個功能的實現(xiàn)原理,只有動手實踐才能真正的了解。就如我在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出爐了,通過調(diào)用、填寫參數(shù)即可請求到服務器。先來分析一下這個ajax的結構,可以看得出來,其實很簡單,只是new了一個XMLHttpRequest對象,然后通過onreadystatechange方法來處理返回值,現(xiàn)在我們只是做了一個判斷,當請求成功時就調(diào)用success方法,如果請求失敗,我們還沒有寫上去,后面我們慢慢完善這個ajax的邏輯。

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

          最后使用send方法帶上參數(shù)發(fā)送請求即可。

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

          那我們再來完善一下這個新生的ajax。我們只需要在onreadystatechange方法里增加一個條件,當請求不成功時調(diào)用自身的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請求失敗的時候執(zhí)行我們想要執(zhí)行的操作。現(xiàn)在我們拋除跨域請求的問題,當你發(fā)送post請求時,你會發(fā)現(xiàn)后臺接收不到傳過來的參數(shù),調(diào)用如下:

          [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. })

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

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

          [javascript] view plain copy

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

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

          比如error方法、method、還有是否異步的bool值等等。那我們再加入一些默認值,現(xiàn)在的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. }

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

          [javascript] view plain copy

          1. a=1&b=2

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

          那我們需要加一個控制格式的參數(shù),我們這里用dataType這個參數(shù)來控制傳參格式,默認是字符串格式傳參好了,可以選擇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格式進行傳參了。現(xiàn)在的ajax完整代碼和調(diào)用方式如下:

          [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. //調(diào)用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. })

          現(xiàn)在這個Ajax基本上已經(jīng)可以滿足業(yè)務上的所以需求,不過還有一點沒有實現(xiàn),我們的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. }

          現(xiàn)在的完整代碼入下:

          [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的底層是如何實現(xiàn),這里只研究了post和get的實現(xiàn)方式。這里的代碼比較簡單,主要是編寫JavaScript模仿Ajax異步實現(xiàn)請求數(shù)據(jù),加深對Ajax的理解,有需要的會注釋上。歡迎一起交流.

          內(nèi)容

          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>

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

          JavaScript實現(xiàn)

          <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定義為一個數(shù)組,這個數(shù)組是一個鍵值對,鍵是get post 而值是一個函數(shù),這個函數(shù)先一步,對數(shù)據(jù)進行校驗。

          Servlet實現(xiàn)

          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實現(xiàn)上傳大文件方案,h5批量下載文件,HTTP+斷點續(xù)傳,前端處理大文件/視頻分片上傳,斷點續(xù)傳,VUE—實現(xiàn)文件上傳(多文件),圖片上傳,VUE 項目大文件上傳下載解決方案,VUE將前端的JSON文件上傳到后臺對應目錄,

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

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

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

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

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

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

          原理到是不復雜。上傳位置不能傳錯。用戶主要強調(diào)穩(wěn)定性和兼容性。

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

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

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

          支持IE,Chrome和信創(chuàng)國產(chǎn)化環(huán)境,比如銀河麒麟,統(tǒng)信UOS,龍芯,

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

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

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

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

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

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

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

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



          將up6組件復制到項目中

          示例中已經(jīng)包含此目錄



          1.引入up6組件



          2.配置接口地址

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

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



          3.處理事件



          啟動測試



          啟動成功



          效果



          數(shù)據(jù)庫



          源碼工程文檔: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


          主站蜘蛛池模板: 亚洲av综合av一区二区三区| 大屁股熟女一区二区三区| 丰满人妻一区二区三区免费视频 | 一区二区无码免费视频网站 | 亚洲午夜精品一区二区麻豆| 麻豆精品一区二区综合av| 中文字幕av人妻少妇一区二区| 狠狠色婷婷久久一区二区三区| 国产中文字幕一区| 激情无码亚洲一区二区三区| 精品一区二区三区免费毛片爱| 在线精品亚洲一区二区小说| 插我一区二区在线观看| 精品无码成人片一区二区| 久久久无码精品人妻一区| 中文字幕一区二区三区在线观看| 国产在线一区二区在线视频 | 韩国福利影视一区二区三区| 国产色综合一区二区三区| 精品国产AⅤ一区二区三区4区 | 无码日本电影一区二区网站| 亚洲色偷偷偷网站色偷一区| 精品无码日韩一区二区三区不卡| 国产日韩AV免费无码一区二区 | 国产成人一区二区三区电影网站 | 亚洲A∨无码一区二区三区| 久久久91精品国产一区二区三区| 伦理一区二区三区| 亚洲爆乳精品无码一区二区三区 | 国精品无码一区二区三区左线| 精品一区二区无码AV| 国产福利视频一区二区| 国产成人无码AV一区二区 | 人妻体内射精一区二区| 日韩一区二区三区在线观看| 国产不卡视频一区二区三区| 精品一区二区三区四区| 久久精品午夜一区二区福利 | 三上悠亚精品一区二区久久| 亚洲A∨无码一区二区三区| 加勒比无码一区二区三区|