巧用jQuery選擇器寫表單辦法總結(提高效率)

相信很多小伙伴都會遇到需要做表單的需求,就像我現在做的醫院項目,茫茫多的表單無窮無盡。一開始做表單使用最笨的方法:一個個span去定義ID,每個數據都用ajax獲取后賦值顯示,然后在表單提交前一個個用jQuery根據ID獲取元素的value,組成一個model來提交給服務器。
后來發現使用jQuery可以大大簡化這個過程。于是我修改了工作方法,總結了我的一些提高寫表單效率的方法。

需求

表單中存在最多的無非就是文本、文本框、單選框、多選框。而一些表單中會有幾十個甚至幾百個選項。我們的目標就是以最高的效率來完成這些表單的數據獲取和數據提交。
注意:如果元素ID和服務器上獲取的json字段的名字是一樣的,那么這篇文章或許能對你提高工作效率有所幫助。

文本和文本框

對于文本和文本框,我們通常需要為元素添加ID來綁定和獲取數據。

將數據顯示到界面中

  • 用for循環遍歷解析成功的JSON數據
  • 通過if判斷過濾數據是span的還是input的。
  • 將數據傳給和數據名同名的ID元素。
for (var key in json) {
   //過濾type為text的文本框
   if ($('#' + key).attr('type') == 'text') {
       $('#' + key).val(json[key]);
   }
   if($('#' + key).prop('tagName') == 'SPAN'){
       $('#' + key).text(json[key]);
   }
}

快速獲取數據對象用于提交服務器

  • 定義空model對象。
  • 通過jQuery選擇器獲取目標元素的value。
  • 將數據傳入model中,對象元素的字段就是HTML元素的ID。
var model = {};
$('input[type="text"]').each(function () {
   model[$(this).attr('id')]=$(this).val();
});
$('span').each(function () {
   model[$(this).attr('id')]=$(this).text();
});
console.log(model);

按照如下方法,我們只需要照著后端提供的數據字段給HTML定義id,而JS就不需要寫太多代碼就可以完成表單了。再也不怕表單字段太多了。

全部代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-2.2.3.js"></script>
</head>
<body>
    <div>
        <div>
            <label>姓名:<input type="text" id="name"></label>
            <label>性別:<input type="text" id="sex"></label>
            <label>年齡:<input type="text" id="age"></label>
            <label>時間:<input type="text" id="time"></label>
        </div>
        <div>
            <label>a:<span id="param01">1</span></label>
            <label>b:<span id="param02">2</span></label>
            <label>c:<span id="param03">3</span></label>
            <label>d:<span id="param04">4</span></label>
        </div>
    </div>
    <button onclick="showResult()">顯示結果</button>
    <script>
        //多條input或者span的快速賦值
        //data是模擬服務器返回的JSON數據
        var data = '{"name":"張三","sex":"女","age":22,"time":"2016-5-10","param01":111,"param02":222,"param03":333,"param04":444}';
        //將數據顯示到頁面中
        var json = eval('(' + data + ')');
        for (var key in json) {
            if ($('#' + key).attr('type') == 'text') {
                $('#' + key).val(json[key]);
            }
            if($('#' + key).prop('tagName') == 'SPAN'){
                $('#' + key).text(json[key]);
            }
        }

        //獲取文本和文本框的內容轉為JSON對象
        function showResult() {
            var model = {};
            $('input[type="text"]').each(function () {
                model[$(this).attr('id')]=$(this).val();
            });
            $('span').each(function () {
                model[$(this).attr('id')]=$(this).text();
            });
            console.log(model);
        }
    </script>
</body>
</html>

Radio和Checkbox

另外一種經常出現于表單中的就是radio、checkbox這些單選多選的元素了。這些元素通常用name命名一組選項。下面我同樣用jQuery簡化數據的顯示和提交。

顯示數據

和之前的文本一樣,用for循環遍歷json數據,然后通過if過濾后顯示到界面。不同之處是這邊是通過name來顯示和綁定數據的。
注:對radio和checkbox處理的方法寫在了后面,所以復制粘貼的同學們請注意別漏了~

for(var key in json){
   if ($('input[name=' + key +  ']').attr('type') == 'radio') {
      showRadioValue(key, json[key]);
   }
   if ($('input[name=' + key +  ']').attr('type') == 'checkbox') {
     showCheckBoxValue(key, json[key]);
   }
}

獲取數據model的方法

  • 定義空model對象。
  • 定義name避免重復添加。
  • 遍歷所有radio獲取結果傳給model
  • 遍歷所有checkbox獲取結果傳給model
        function showResult() {
            var model = {};
            var radioName = '';
            var checkboxName = '';
            $("input[type='radio']").each(function () {
                if($(this).attr('name') != radioName){
                    radioName = $(this).attr('name');
                    model[radioName] = getRadioValue(radioName);
                }
            });
            $("input[type='checkbox']").each(function () {
                if($(this).attr('name') != checkboxName){
                    checkboxName = $(this).attr('name');
                    model[checkboxName] = getCheckboxValue(checkboxName);
                }
            });
            console.log(model);
        }

處理radio和checkbox的一些方法

這里我對radio和checkbox的顯示和獲取結果寫了幾個方法。

        function showRadioValue(name, value) {
            $('input[name=' + name +  ']').each(function () {
                if(value == $(this).val()){
                    $(this).attr('checked', 'true');
                }
            });
        }

        function getRadioValue(name) {
            var value = 0;
            var i = 0;
            $('input[name=' + name + ']' ).each(function () {
                if ($('input[name=' + name + ']').eq(i).is( ':checked')) {
                    value = $('input[name=' + name + ']').eq(i).val();
                    return;
                }
                i++;
            });
            return value;
        }

        function showCheckBoxValue (name, value) {
            var values = value.split(',' );
            var row = 1;
            $('input[name="' + name + '"]').each( function () {
                if (values[row] == 1) {
                    $(this).attr("checked" , 'true');
                }
                row++;
            });
        }

        function getCheckboxValue (name) {
            var text = "" ;
            $('input[name="' + name + '"]').each( function () {
                var t = '' ;
                if ($(this ).is(':checked')) {
                    t = "1";
                } else {
                    t = "0";
                }
                text += "," + t;
            });
            return text;
        }

代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-2.2.3.js"></script>
</head>
<body>
    <div>
        <div>
            <label><input type="radio" name="param01" value="1">1</label>
            <label><input type="radio" name="param01" value="2">2</label>
            <label><input type="radio" name="param01" value="3">3</label>
        </div>
        <div>
            <label><input type="radio" name="param02" value="1">1</label>
            <label><input type="radio" name="param02" value="2">2</label>
            <label><input type="radio" name="param02" value="3">3</label>
        </div>
        <div>
            <label><input type="radio" name="param03" value="1">1</label>
            <label><input type="radio" name="param03" value="2">2</label>
            <label><input type="radio" name="param03" value="3">3</label>
        </div>
        <div>
            <label><input type="checkbox" name="param04">1</label>
            <label><input type="checkbox" name="param04">2</label>
            <label><input type="checkbox" name="param04">3</label>
            <label><input type="checkbox" name="param04">3</label>
        </div>
        <div>
            <label><input type="checkbox" name="param05">1</label>
            <label><input type="checkbox" name="param05">2</label>
            <label><input type="checkbox" name="param05">3</label>
            <label><input type="checkbox" name="param05">3</label>
        </div>
        <button onclick="showResult()">顯示結果</button>
        <label id="result">result</label>
    </div>
    <script>
        //多條radio或者checkbox的快速賦值
        var data = '{"param01":"1","param02":"3","param03":"2","param04":",1,0,0,0","param05":",0,0,1,1"}';
        var json =eval( '(' + data + ')');
        for(var key in json){
            if ($('input[name=' + key +  ']').attr('type') == 'radio') {
                showRadioValue(key, json[key]);
            }
            if ($('input[name=' + key +  ']').attr('type') == 'checkbox') {
                showCheckBoxValue(key, json[key]);
            }
        }

        function showRadioValue(name, value) {
            $('input[name=' + name +  ']').each(function () {
                if(value == $(this).val()){
                    $(this).attr('checked', 'true');
                }
            });
        }

        function getRadioValue(name) {
            var value = 0;
            var i = 0;
            $('input[name=' + name + ']' ).each(function () {
                if ($('input[name=' + name + ']').eq(i).is( ':checked')) {
                    value = $('input[name=' + name + ']').eq(i).val();
                    return;
                }
                i++;
            });
            return value;
        }

        function showCheckBoxValue (name, value) {
            var values = value.split(',' );
            var row = 1;
            $('input[name="' + name + '"]').each( function () {
                if (values[row] == 1) {
                    $(this).attr("checked" , 'true');
                }
                row++;
            });
        }

        function getCheckboxValue (name) {
            var text = "" ;
            $('input[name="' + name + '"]').each( function () {
                var t = '' ;
                if ($(this ).is(':checked')) {
                    t = "1";
                } else {
                    t = "0";
                }
                text += "," + t;
            });
            return text;
        }

        function showResult() {
            var model = {};
            var radioName = '';
            var checkboxName = '';
            $("input[type='radio']").each(function () {
                if($(this).attr('name') != radioName){
                    radioName = $(this).attr('name');
                    model[radioName] = getRadioValue(radioName);
                }
            });
            $("input[type='checkbox']").each(function () {
                if($(this).attr('name') != checkboxName){
                    checkboxName = $(this).attr('name');
                    model[checkboxName] = getCheckboxValue(checkboxName);
                }
            });
            console.log(model);
        }
    </script>
</body>
</html>

Tips

  • 如果有一些特殊處理的內容(如時間格式文本),可以先遍歷后在遍歷之后單獨進行賦值。
  • 以上方法可以用于所有以ID定義的用于顯示和獲取數據的HTML元素。
  • 用好jQuery的選擇器可以獲取到任何所需的元素、元素集合。
  • 在each()方法中$(this)表示當前元素。
  • 獲取所選ID的元素標簽:$('#' + key).prop('tagName') == 'SPAN',注意:標簽結果'SPAN'都是大寫的,可以打log驗證。
  • 不斷找規律、總結提煉,找出最好的偷懶方法,盡量避免體力勞動。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • //------------------------- 第一章 認識JQuery ----------------...
    米塔塔閱讀 736評論 0 9
  • “你知道問題,就去解決問題,這就是最簡單的方法。 你要找到貴人很重要,但同時你要做好自己的貴人,比如你做事麻利一點...
    sula愛做夢閱讀 203評論 0 1
  • 成都是一座歷史淵緣留長的城市,我和幾個朋友到成都玩了一趟,確實有很大收獲,感受到了這座城市不一樣的魅力。說到成...
    真真媽媽閱讀 274評論 0 1
  • 很久很久以前,有一個小女孩特別調皮。 2004年,剛剛過完年十五那天,她突然告訴爸爸媽媽她想出門打工,體驗一下打工...
    陶光琴閱讀 535評論 0 1