1. 程式人生 > >使用jQuery.form外掛,實現完美的表單非同步提交

使用jQuery.form外掛,實現完美的表單非同步提交

時間真快,轉眼一個月快結束了,一個月沒寫部落格了!手開始生了,怎麼開始呢……

抓住6月份的尾巴,今天的主題是

通過該外掛,我們可以非常簡單的實現表單的非同步提交,並實現檔案上傳、進度條顯示等等。

現在我們從一個ASP.NET同步表單提交開始,然後再將其轉化為非同步的表單提交。我寫了3種表單提交示例,並簡單分析了各種方式的利弊。

當然主題還是使用jQuery表單外掛輕鬆實現表單非同步提交以及分析下該外掛的原始碼。

ASP.NET伺服器端控制元件實現同步表單提交

ASP.NET伺服器控制元件最大特徵就是標籤包含IDrunat=”server”屬性,在客服端頁面內容中會輸出類似

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGR/8ZxOm5Tn0sfHNJaqE12hKqqJTQ==">標籤,用於儲存控制元件值資料。如下:

    <form runat="server" id="server_form" method=”post”>
        <table border="1">
            <tr>
                <td>使用者名稱:</td>
                <td>
                    <asp:TextBox ID="txtLoginName" runat="server" AutoPostBack=”true” ></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center">
                   <asp:Button ID="btnSubmit" runat="server" Text="伺服器控制元件同步提交模式" />
                   <asp:Button ID="btnUnSubmit" runat="server" OnClientClick="return false;" Text="不提交表單" /> 
                </td>
            </tr>
        </table>
    </form>
    <asp:Label ID="labResponse" runat="server"></asp:Label>

我們用ASP.NET伺服器控制元件構建了一個表單,在ASP.NET頁面中有這樣限定:

1)一頁只能有一個伺服器端 Form 標記,其他伺服器端控制元件都在該表單中。

2)頁面中伺服器端Form中任何導致頁面回發的伺服器端控制元件事件都會觸發表單提交事件submit。比如:

a)單擊沒有在OnClientClick事件中return false的伺服器端按鈕控制元件

b)AutoPostBack屬性設定為trueTextBoxRadioButtonCheckBoxDropDownList等伺服器端控制元件的值改動時都會觸發頁面回發。

c)另外:type=”submit”的客服端標籤

<input type=”submit” />導致表單提交

此方案優勢:

1)我們在後臺可以非常輕易的獲取伺服器端控制元件的值,比如使用this. txtLoginName.Text訪問控制元件的值或根據表單提交方式在this.Context.Request中獲取表單元素值。

2)我們在後臺可以輕鬆設定頁面伺服器端控制元件的值,比如使用this. labResponse.Text = “表單提交成功

此方案劣勢:

劣勢很明顯,效率低下,每一次導致的頁面回發都會觸發完整的ASP.NET頁面生命週期,造成出現白頁的情況。(更多描述請看:

         ASPNET_生命週期

jQuery非同步提交表單

現在我們已經意識到使用同步方式提交表單會造成出現白頁的糟糕使用者體驗,那好,現在我使用上一篇分享的技術來將上面同步提交表單調整為非同步提交表單的方式。

    <form id="form1" method="post">
        <table border="1">
            <tr>
                <td>使用者名稱:</td>
                <td>
                    <input type="text" name="loginName" /></td>
            </tr>
            <tr>
                <td>愛  好:</td>
                <td>
                    <input type="checkbox" name="cbLoveYy" value="1" />游泳
                    <input type="checkbox" name="cbLoveYx" value="1" />遊戲
                    <input type="checkbox" name="cbLovePs" value="1" />爬山
                </td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center">
                    <input id="btnAjaxSubmit" type="submit" value="jQuery.ajax提交" />
                </td>
            </tr>
        </table>
    </form>

jQuery提交程式碼如下:

    <script type="text/javascript">
        $(document).ready(function () {
            $("#btnAjaxSubmit").click(function () {
                var options = {
                    url: 'async_submit_test1.aspx?action=SaveUserInfo',
                    type: 'post',
                    dataType: 'text',
                    data: $("#form1").serialize(),
                    success: function (data) {
                        if (data.length > 0)
                            $("#responseText").text(data);
                    }
                };
                $.ajax(options);
                return false;
            });
        });
    </script>

我們通過$("#form1").serialize()將表單元素的資料轉化為字串,然後通過$.ajax()執行非同步請求資源。

方案:jQuery.ajax() + .aspx請求

此方案優勢:

1)我們不會感覺頁面的閃一閃效果

2)我們不會因為伺服器耗時響應而導致出現百頁的糟糕使用者體驗。

此方案劣勢:

1)此方案中我還是使用了aspx頁面去響應請求,只是在後臺通過action引數去做相應處理,儘管是非同步操作但卻完完整整的跑了一遍ASP.NET頁面生命週期(這也是在Response.Write()輸出完自己的東西后必須呼叫Response.End();來提前終止生命週期,否則頁面資訊也會一起返回)

2)jQuery庫提供的序列化表單字串方法不能收集檔案上傳的表單元素,如,$("#form1").serialize()。所以對於包含檔案上傳的表單我們還需通過<iframe>模擬非同步表單提交。(<iframe>模擬非同步表單提交的過程我將在分析jQuery.form外掛的原始碼小節進行說明)

jQuery庫提供的序列化字串的資料來源時表單的elements屬性,而<input type=”file” />的表單元素不包含在elements中)

當然jQuery.ajax()也可以結合.ashx檔案(一般處理檔案)或其他方式實現高效非同步請求,這邊只是為了說明:非同步請求aspx頁面也會跑一邊aspx頁面生命週期的事實。

jQuery.form外掛輕鬆實現表單提交

現在我們使用jQuery的表單外掛來實現非同步表單提交。

1)該外掛需要Jquery最低版本為v1.5

2)該外掛提供了ajaxSubmitajaxForm兩種表單提交方式,但不要對同一個表單同時使用兩種方式。

相關推薦

使用jQuery.form外掛實現完美非同步提交

時間真快,轉眼一個月快結束了,一個月沒寫部落格了!手開始生了,怎麼開始呢…… 抓住6月份的尾巴,今天的主題是 通過該外掛,我們可以非常簡單的實現表單的非同步提交,並實現檔案上傳、進度條顯示等等。 現在我們從一個ASP.NET同步表單提交開始,然後再將其轉化為非同步的表單提交。我寫了3

[寫著玩]理解multipart/form-data構造http實現android圖片上傳

關於multipart/form-data,可參考https://blog.csdn.net/zshake/article/details/77985757 客戶端  引數解釋,上傳主方法 private void submit() { Map<String, Obj

jQuery validate外掛做正整數驗證

jQuery validate外掛為表單提供了強大的表單驗證功能。 詳細參考菜鳥教程: http://www.runoob.com/jquery/jquery-plugin-validate.html 下面是js表單驗證正整數的例子: //自定義校驗,正整數 jQuery.vali

jquery 動態增加減少input的方法

html程式碼如下 <html> <tr><button style="margin-left:10px" class="add_field_button btn">Add</button></tr>

jquery非同步提交

 <script type="text/javascript">     $("input").blur(function(){          var $formData=$("#frm");  

Spring MVC攔截器+註解方式實現防止重複提交

表單重複提交是在多使用者Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重複提交問題,比如: 1.點選提交按鈕兩次。2.點選重新整理按鈕。3.使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。4.使用瀏覽器歷史記錄重複提交表單。5.瀏覽器重複的HTTP

vue-cli中使用FormData實現非同步提交

<form @submit.prevent="submit($event)">    <input type="text" class="form-control" placeholder="請輸入姓名" name="cuserName">    &l

利用Spring AOP和redis的鎖來實現防止重複提交

表單重複提交是在web中存在的一個很常見,會帶來很多麻煩的一個問題。尤其是在表單新增的時候,如果重複提交了多條一樣的資料,帶來的麻煩更大。 實現防止表單重複提交的方法有前端限制和後臺限制1、前端限制就是當點選了提交按鈕之後,就給按鈕新增屬性disabled,然後等後臺返回提交

SpringBoot攔截器+註解方式實現防止重複提交

表單重複提交在web應用中是比較常見的問題,重複提交的動作容易造成髒資料,為了避免這重複提交的操作簡便的方便是採用攔截器+註解的方式。 基本的原理: url請求時,用攔截器攔截,生成一個唯一的識別符號(token),在新建頁面中Session儲存toke

JavaScript基礎 submit按鈕配合form的onsubmit實現提交與驗證

java asc body bmi 是我 技術 pos true value 鎮場詩:    清心感悟智慧語,不著世間名與利。學水處下納百川,舍盡貢高我慢意。    學有小成返哺根,願鑄一良心博客。誠心於此寫經驗,願見文者得啟發。—————————————————————

jQuery基礎(常用插件 驗證圖片放大鏡自定義對象級jQuery UI面板折疊)

此外 cookie值 添加圖標 tor 列表 需要 droppable 使用 ddn 1.表單驗證插件——validate 該插件自帶包含必填、數字、URL在內容的驗證規則,即時顯示異常信息,此外,還允許自定義驗證規則,插件調用方法如下: $(form).vali

Form提交數據頁面不跳轉返回

bre ava case java ssr ace 引用 except erl html代碼: <form method="post" action="Handler/UserHandler.ashx?action=Test" onsubmit="return Rut

檔案上傳下載時form中設定屬性enctype=“multipart/form-data”的情況下如何獲取提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

form可以提交阻止頁面跳轉

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body&g

實現Vue驗證外掛

表單驗證存在於每一個後臺系統中,它承載了許多的邏輯以及狀態。但是,過於某些的場景,會導致程式碼臃腫,如何更好地梳理它,來解決開發的痛點。 1. 前言 上篇文章介紹了,如何函式式呼叫表單元件從而減少維護其狀態的方法基於Vue構造器建立Form元件的通用解決方案。現在來介紹下如何處理表單驗證問題,現

Tornado實現提交檔案的獲取

#注意下面的config的配置檔案 from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from tornado.options import define, parse_config_file, o

AJAX實現圖片上傳和預覽(傳統ajax與jQuery AJAX;帶圖片的提交

  一、通過Servlet3.0和傳統的AJAX實現圖片上傳和預覽          此方法也適用於帶圖片的表單提交         上傳時預覽圖片    

Jquery不使用form非同步上傳檔案的方法

    現在的專案中需要使用到不重新整理頁面的方式實現上傳檔案,實現方法如下: html程式碼:   檔案:<input id="file" type="file" name="file"/> <butt

css實現整個只讀 form readonly

原文出處:https://blog.csdn.net/miaoqinian/article/details/81192082 我說的方法只需要給表單加上一個類,就可以讓表單只讀。 <form class="form-readonly"></form>  

formajax提交後臺實體接收

js:表單->json物件 $.fn.serializeObject = function() {     var o = {};     var a = this.serializeArray();     $.each(a, function() {