1. 程式人生 > 其它 >Form表單使用、ajax解決表單提交後頁面跳轉資料丟失的問題缺點

Form表單使用、ajax解決表單提交後頁面跳轉資料丟失的問題缺點

一、Form表單基本使用

表單概念在網頁中主要負責 資料採集功能。HTML中<form>標籤,就是用於採集使用者輸入的資訊,並通過 <form>標籤的提交操作,把採集的資訊提交到伺服器端進行處理

表單的組成部分:

• 表單標籤

•表單域:包含了文字框,密碼框,隱藏域,都行文字框,複選框,單選框,下拉選擇框和檔案上傳框等等

表單按鈕:通過設定type屬性為submit來觸發form表單的提交

<form> 標籤的屬性

action

action:屬性用來規定當提交表單時,向何處傳送表單資料

action 屬性的值應該是後端提供的一個URL地址,這個URL地址專門負責接收表單提交過來的資料。

<form>表單在未制定 action 屬性值的情況下,action的預設值為當前頁面的 URL 地址

注意: 當提交表單後,會立即跳轉到 action 屬性指定的 URL 地址

target

target 屬性用來規定 在何處開啟 action URL

它的可選值有5個,預設情況下,target的值是 _self,表示在相同的框架中開啟 action URL

method

method 屬性用來規定 以何種方式 把表單資料提交到 action URL

它的可選值有兩個,分別是 getpost

預設情況下,method的值為 get, 表示通過URL地址的形式,把表單資料提交到 action URL

注意:

  • get 方式適合用來提交少量的簡單的資料

  • post 方式適合用來提交大量的複雜的,或包含檔案上傳的資料

enctype

enctype屬性用來規定在 傳送表單資料之前如何對資料進行編碼

可選值有三個,預設情況下,enctype的值為 application/x-www-form-urlencoded,表示在傳送前編碼的所有字元

表單的同步提交及缺點

什麼是表單的同步提交

通過點選 submit 按鈕,觸發表單提交的操作,從而使頁面跳轉到 action URL 的行為,叫做表單的同步提交

表單同步提交的缺點

  • <form> 表單同步提交後,整個頁面會發生跳轉,跳轉到 action URL 所指向的地址

    ,使用者體驗很差

  • <form> 表單同步提交後,頁面之前的狀態和資料會丟失

如何解決呢?

表單只複雜採集資料,Ajax負責將資料提交到伺服器

二、通過Ajax提交表單資料

監聽表單提交事件

jQuery 中,可以使用如下兩種方式,監聽到表單的提交事件

阻止表單預設提交行為

當監聽到表單的提交事件以後,可以呼叫事件物件的 event.preventDefault() 函式,來阻止表單的提交和頁面的跳轉

如何快速獲取表單資料

serialize() 函式

為了簡化表單中資料的獲取操作,jQuery提供了 serialize() 函式,語法格式如下:

好處:可以一次性獲取表單的資料

示例程式碼:

注意:在使用 serialize() 函式快速獲取表單資料時,必須為每個表單元素新增 name 屬性

示列如下:

溫馨提示:案例中引入的bootstrap.css、jquery.js,可自行去官網下載後再引入使用
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5   <meta charset="UTF-8">
 6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8   <title>Document</title>
 9   <link rel="stylesheet" href="./lib/bootstrap.css" />
10   <script src="./lib/jquery.js"></script>
11   <script src="./js/cmt.js"></script>
12 </head>
13 
14 <body style="padding: 15px;">
15 
16   <!-- 評論面板 -->
17   <div class="panel panel-primary">
18     <div class="panel-heading">
19       <h3 class="panel-title">發表評論</h3>
20     </div>
21     <!-- 1 div改造成form標籤並起個名字 2 監聽表單的提交submit 3 serilize()用來獲取表單資料  -->
22     <form class="panel-body" id="formAddCmt">
23       <div>評論人:</div>
24       <input type="text" class="form-control" name="username" autocomplete="off" />
25       <div>評論內容:</div>
26       <textarea class="form-control" name="content"></textarea>
27 
28       <button type="submit" class="btn btn-primary">發表評論</button>
29     </form>
30   </div>
31 
32 
33   <!-- 評論列表 -->
34   <ul class="list-group" id="cmt-list">
35     <li class="list-group-item">
36       <span class="badge" style="background-color: #F0AD4E;">評論時間:</span>
37       <span class="badge" style="background-color: #5BC0DE;">評論人:</span>
38       Item 1
39     </li>
40   </ul>
41 
42 </body>
43 
44 </html>

cmt.js檔案

 1 $(function () {
 2   // 獲取圖書列表資料
 3   function getNewsList() {
 4     $.ajax({
 5       type: "GET",
 6       url: "http://www.liulongbin.top:3006/api/cmtlist",
 7       success: function (res) {
 8         if (res.status !== 200) return alert("獲取圖書列表失敗!!");
 9         // 獲取圖書成功
10         // 把資料渲染到頁面
11         var rows = [];
12         $.each(res.data, function (i, item) {
13           var str = `<li class="list-group-item">
14        <span class="badge" style="background-color: #F0AD4E;">評論時間:${item.time}</span>
15        <span class="badge" style="background-color: #5BC0DE;">評論人:${item.username}</span>
16        ${item.content}
17       </li>`;
18           rows.push(str);
19         });
20         $("#cmt-list").empty().append(rows.join(""));
21       },
22     });
23   }
24   getNewsList();
25   // 表單功能
26   $("#formAddCmt").on("submit", function (e) {
27     //阻止表單預設提交行為
28     e.preventDefault();
29     // 一次性獲取表單的資料
30     var data = $(this).serialize();
31     $.ajax({
32       type: "POST",
33       url: "http://www.liulongbin.top:3006/api/addcmt",
34       data,
35       success: function (res) {
36         if (res.status !== 200) return alert("發表評論列表失敗");
37         getNewsList();
38         //重置表單
39         // $("#formAddCmt")[0]轉換成原生DOM
40         $("#formAddCmt")[0].reset();
41       },
42     });
43   });
44 });