程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 探討:如何更快的賦值取值

探討:如何更快的賦值取值

編輯:C#入門知識

背景

  顯示數據時,常規賦值與取值是這樣的.

// set
$("#name").val(data.name);
$("#realname").val(data.realname);
$("#address").val(data.address);
$("#sex").val(data.name);
$("#love").attr(!!data.love);

// get
var data = {
    name:$("#name").val(),
    realname:$("#realname").val(),
    address:$("#address").val(),
    sex:$("#sex").val(),
    love:$("#love").attr('checked')
};

  最近的項目字段是相當多,大概有30+,樓主寫的也郁悶了。賦值與取值,真是機械活。於是想到表單提交時,不准確的說,是後台接收到的數據均是控件的name與value的鍵值對,既然表單可以這樣直接取值,並提交給後台,那賦值也應該是可以的。

  總結樓主的需求,獲取到一個實體對象,直接將對象的數據賦值到頁面的控件中。根據實體對象的定義,直接取得頁面上控件的值,以對象形式返回。

實現

  看不明白沒關系,大意就是這樣,先來看看頁面與js調用是怎麼寫的。

    <form id="form1">
        <input type="text" name="uid" />
        <input type="text" name="pwd" />
        <input type="checkbox" name="love" />
        <input type="radio" name="g1" value="1" />
        <input type="radio" name="g1" value="2" />
        <input type="radio" name="g1" value="3" />
        <input type="text" name="gselect" value />
        <select name="sl">
            <option value="11">11</option>
            <option value="22">22</option>
        </select>
    </form>
    <input type="button" id="btn" value="取值" />

  表單裡的控件均指定了name,作為存值或取值的key。

    var data = {
        uid: 'cnblogs',
        pwd: '12345',
        sl: '22',
        love: true,
        g1: '3',
        gselect: function () {
            return $("#form1 [name=g1]:checked").val();
        }
    };
    $("#btn").on('click', function () {
        var d = $("#form1").getModel(data);
        alert(JSON.stringify(d));
    });
    $("#form1").setModel(data);

  這樣就能完成賦值與取值了。其中具體實現則是根據控件的類型,取出相應的值,如vakue屬性,checked屬性等。

  初步實現是這樣的,可以根據實際的應用做修改。

    (function ($) {
        function BindModel(p) {
            p = $.extend({ method: 'get', data: {} }, p);
            var isGet = p.method == "get";
            var ret = {};
            for (var name in p.data) {

                var $name = $(p.container).find("[name='" + name + "']");

                //未找到則跳過
                if (!$name.length) continue;

                //獲取當前對象值
                var value;
                if (typeof p.data[name] == "function") {
                    //為函數時,取值就終止
                    if (isGet) {
                        ret[name] = p.data[name].call();
                        continue;
                    }
                    else {
                        value = p.data[name].call();
                    }
                } else {
                    value = p.data[name];
                }

                //根據控件類型來賦值
                var tag = $name[0].tagName;
                var t = $name.attr("type");
                if (tag == "SELECT" || t == "text") {
                    if (isGet) ret[name] = $name.val();
                    else $name.val(value || '');
                } else if (t == "checkbox") {
                    if (isGet) ret[name] = !!$name.attr('checked');
                    else $name.attr('checked', !!value);
                } else if (t == "radio") { //單選框name相同為一組,根據value來區分啦
                    $name.each(function () {
                        if (isGet && this.checked) {
                            ret[name] = this.value;
                            return false;
                        }
                        else if (!isGet && this.value == value) {
                            this.checked = true;
                        }
                    });
                }
                else if (tag == 'TD' || tag == 'SPAN') {
                    if (isGet) ret[name] = $name.text();
                    else $name.text(value)
                }
            }
            if (isGet) return ret;
        }
        $.fn.setModel = function (data) {
            BindModel({ method: 'set', data: data, container: this });
        }
        $.fn.getModel = function (data) {
            return BindModel({ method: 'get', data: data, container: this });
        }
    })(jQuery);

  此舉的目的旨在維護老項目時,讓大家取值賦值更快,解放親們的雙手。

  目前是一個想法與初步實現,如果你有更好的想法,歡迎告知一二,先謝過。

  打包下載

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved