整合營銷服務商

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

          免費咨詢熱線:

          表單提交form提交和ajax提交

          表單提交form提交和ajax提交

          、使用場景:

          安全性都一樣,都是發送的http協議。安全性與提交文件的業務處理(格式檢測,防注入)有關,與提交方式無關。

          一般登錄用表單提交,點擊提交觸發submit事件,一般會 使頁面發生跳轉,頁面的跳轉等行為的控制往往在后端,后端控制頁面的跳轉及數據的傳遞;但是某些時候不希望頁面跳轉,或者說想要將控制權放在前端,通過js來操作頁面的跳轉或數據變化,一般這種異步操作,都會使用ajax。

          但是Ajax會有個隱藏的問題,即瀏覽器不保存密碼,不符合用戶習慣。理想的方式:建立隱藏的iframe,把form標簽的target指向iframe,然后檢測iframe的狀態。

          2、比較:

          (1)ajax在提交、請求、接收時,都是異步進行,網頁不需要刷新,只刷新頁面局部,不關心也不影響頁面其他部分的內容。

          Form提交則是新建一個頁面,哪怕是提交給自己本身的頁面,也需要刷新,為了維持頁面用戶對表單的狀態改變,要在控制器和模板之間傳遞更多參數以保持頁面狀態。

          (2)ajax提交時,是在后臺新建一個請求。

          Form卻是放棄本頁面,然后再請求。

          (3)ajax必須要用js來實現,存在調試麻煩、瀏覽器兼容問題,而且不啟用js的瀏覽器,無法完成操作。

          Form表單是瀏覽器自帶的,無論是否開啟js,都可以提交表單。

          (4)ajax在提交、請求、接收時,整個過程都需要使用程序來對其進行數據處理。

          Form表單提交,是根據表單結構自動完成,不需要代碼干預。用submit提交。

          3、其他方面:

          關于輸入內容的校驗,ajax可以在獲取到元素內容用程序判斷;form表單的屬性中有校驗的字段,easyui,jeecg等中都封裝,用戶只需添加正則表達式的校驗規則。

          4、例:

          (1)使用form提交

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

          <head>

          <title>login test</title>

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

          </head>

          <body>

          <div id="form-div">

          <form id="form1" action="/users/login" method="post">

          <p>用戶名:<input name="userName" type="text" id="txtUserName" tabindex="1" size="15" value=""/></p>

          <p>密 碼:<input name="password" type="password" id="TextBox2" tabindex="2" size="16" value=""/></p>

          <p><input type="submit" value="登錄">&nbsp<input type="reset" value="重置"></p>

          </form>

          </div>

          </body>

          </html>

          1. 在業務上面使用到了ajax上傳圖片,采用的方式是提供一個公用的api進行圖片上傳,然后返回圖片的在服務器的url,這樣在其他地方使用到時,直接提交圖片的url,而不是圖片資源,避免影響應能和體驗,也方便后期切換(如果后期采用了第三方圖片服務,或者對圖片需要進行處理,只要改造這個接口就好了)。
          2. 使用Ajax提交表單數據(包含上傳文件)有兩種形式
          • using only AJAX
          • using the FormData API
          1. 優缺點
          • Using the FormData API is the simplest and fastest, but has the disadvantage that data collected can not be stringified.
          • Using only AJAX is more complex, but typically more flexible and powerful.

          FormData簡介

           The FormData object lets you compile a set of key/value pairs to send using XMLHttpRequest. It is primarily intended for use in sending form data, but can be used independently from forms in order to transmit keyed data. The transmitted data is in the same format that the form's submit() method would use to send the data if the form's encoding type were set to multipart/form-data.
          

          大致意思是你可以將數據使用FormData對象編譯成鍵值對形式,然后使用XMLHttpRequest技術向后端發送數據。主要是用來發送form表單數據,也可以發送帶鍵數據。這種形式傳輸的數據和一個enctype屬性為multipart/form-data并且采用submit()方法提交的form表單傳輸的數據格式相同。

          Ajax使用FormData提交數據

          只是簡單的示范一下文件上傳,表單數據類似,不寫例子了。

          Ajax上傳文件-帶form標簽的FormData提交

          <!DOCTYPE html>
          <html lang="en">
          <head>
           <meta charset="UTF-8">
           <title>測試</title>
          </head>
          <body>
          <form id="upload" method="post">
           <input id="file" type="file" name="file"/>
           <input id="img" type="hidden"/>
           <input type="submit" value="上傳圖片">
          </form>
          <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
          <script type="text/javascript">
          var BASE_URL='../'
          $(document).ready(function(){
           $('#file').on('change', function() {
           var formData=new FormData($('#upload')[0])
           $.ajax({
           url: BASE_URL + 'api/upload',
           type: 'post',
           cache: false,
           data: formData,
           processData: false,
           contentType: false,
           success: function(res) {
           console.log(res)
           }
           })
           })
          })
          </script>
          </body>
          </html>
          <?php
          print_r($_FILE);exit();
          ?>
          

          特點:form表單提交,帶有<form>標簽,enctype="multipart/form-data"不設置也可以。

          Ajax不帶form標簽的FormData提交

          <!DOCTYPE html>
          <html lang="en">
          <head>
           <meta charset="UTF-8">
           <title>測試</title>
          </head>
          <body>
           <input id="file" type="file" name="file"/>
           <input id="img" type="hidden"/>
           <input type="submit" value="上傳圖片">
          <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
          <script type="text/javascript">
          var BASE_URL='../'
          $(document).ready(function(){
           $('#file').on('change', function() {
           console.log(this.files)
           var formData=new FormData()
           formData.append("file", this.files[0]);
           $.ajax({
           url: BASE_URL + 'api/upload',
           type: 'post',
           cache: false,
           data: formData,
           processData: false,
           contentType: false,
           success: function(res) {
           console.log(res)
           }
           })
           })
          })
          </script>
          </body>
          </html>
          <?php
          print_r($_FILE);exit();
          ?>
          

          沒有<form>標簽,基本使用場景中使用的是這種。

          Ajax不使用FormData提交數據

          從參考2來看,上傳文件需要使用使用FileReader對象,并且Ajax不使用FormData提交數據略復雜,幸虧有一些大咖封裝了一下,比如官方提供了一個A little vanilla framework(一點香草??????這個使用原生寫的,不是封裝,,,),再比如ajaxFileUpload(github地址是參考5,官方有示例,試了一下,妥妥的支持IE6..)。

          感受

          FormData是HTML5新增的屬性,可能在兼容瀏覽器上面會拋棄一些古典(old)瀏覽器,不過簡單;利用純Ajax提交也還好,因為有很多現成的庫,比如jquery,axios...從A little vanilla framework的示例(參考2)來看,基本是根據form表單的encypt形式,采用相應的方式發送數據。

          參考

          1. https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
          2. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Submitting_forms_and_uploading_files
          3. https://developer.mozilla.org/en-US/docs/Web/API/FileReader
          4. https://www.cnblogs.com/zhuxiaojie/p/4783939.html
          5. https://github.com/davgothic/AjaxFileUpload


          有的時候在想,JSP頁面提交數據到后臺,可以被Servlet容器解析,然后獲取到前臺參數。操作成功后,后臺可以重定向或者轉發到其他頁面去。但是,我如何在本頁獲知我已經上傳成功,或者表達那內容提交成功的呢?

          普通的html或者jsp控件本身是無法做到的,因為在你點擊submit提交數據以后,瀏覽器就等待response了,剩下的用戶無從干預。

          其實,js很容易就能做到這點。

          一個修改頭像的例子

          <from action="" enctype="multipart/form-data" method="post">
          
          <a>
          
          <span>修改頭像</span>
          
          <input type="file" id="fileUp" accept="image/png,image/jpeg">
          
          </a>
          
          </from>
          var fileM=document.querySelector("#fileUp");
          
          $("#fileUp").on("change",function() {
          
          //獲取文件對象,files是文件選取控件的屬性,存儲的是文件選取控件選取的文件對象,類型是一個數組
          
          var fileObj=fileM.files[0];
          
          //創建formdata對象,formData用來存儲表單的數據,表單數據時以鍵值對形式存儲的。
          
          var formData=new FormData();
          
          formData.append('file', fileObj);
          
          $.ajax({
          
          url: "自己的后臺的Url",
          
          type: "post",
          
          dataType: "json",
          
          data: formData,
          
          async: true,
          
          cache: false,
          
          contentType: false,
          
          processData: false,
          
          success: function (json_data) {
          
          alert("上傳成功!");
          
          },
          });
          });

          在點擊"修改頭像"的鏈接后,會打開一個文件選擇窗選中圖片后就會將其上傳到服務器。

          如果后臺是tomcat,那么就可以從request域中拿到"file"鍵值對應的對象fileObj,開啟流就能接收。

          總結

          在上面的例子中,formData對象可以添加任意類型的對象,例如string,file,array等等。

          所以可以通過原生JS后者類似Jquery這類框架的選擇器,將表單字段獲取到,然后放入formData對象中,并且禁用表單的submit事件(表單禁用submit的方式太多了,這里就不贅述了,由讀者自行百度~),由Ajax異步來提交表單,提交完成后可以接受后臺的JSON反饋,然后告訴用戶提交成功或者失敗,由于什么原因失敗!

          不由的感嘆一句,JS在Web開發中的地位真的是無可匹敵呀!

          本文僅為學習交流所用,如有錯疏,還望指正。喜歡本文可以收藏,或者點個關注,每天都有新鮮技術分享


          主站蜘蛛池模板: 毛片一区二区三区| 国产一区二区精品在线观看| 国产精品一区在线麻豆| 伊人久久一区二区三区无码| 人妻少妇久久中文字幕一区二区 | 无码AV动漫精品一区二区免费| 麻豆AV一区二区三区久久| 污污内射在线观看一区二区少妇| 中文字幕VA一区二区三区 | 国产精品视频一区国模私拍| 怡红院AV一区二区三区| 精品无码人妻一区二区三区不卡 | 少妇一夜三次一区二区| 日韩A无码AV一区二区三区| 国精无码欧精品亚洲一区| 精品国产一区二区三区麻豆| 日本一区二区三区在线视频观看免费| 无码视频一区二区三区| 中文字幕一区二区三区精华液| 91精品乱码一区二区三区| 国产午夜精品一区二区| 亚洲AV香蕉一区区二区三区| 中文字幕精品亚洲无线码一区| 国产精品久久亚洲一区二区| 国产美女在线一区二区三区| 亚洲A∨精品一区二区三区| 国产乱码精品一区二区三区| 国产成人无码AV一区二区在线观看| 在线精品视频一区二区| 无码AV天堂一区二区三区| 午夜天堂一区人妻| 中文字幕一区二区三区免费视频| 精品国产AV无码一区二区三区| 中文字幕日韩丝袜一区| 美女毛片一区二区三区四区| 国产免费无码一区二区| 奇米精品一区二区三区在线观看| 国产成人久久精品麻豆一区| 日韩一区二区三区免费播放| | 精品国产亚洲第一区二区三区|