jquery 實現動態表單設計


只是實現了前台頁面的動態表單的設計,並未實現后台綁定數據到數據庫等功能。技術使用到的為jquery和bootstrap。俗話說有圖有真相,先說下具體效果如下:                                 

點擊添加一個面板容器:

容器添加成功:

 實現的代碼如下: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <script src="../js/jquery-1.8.3.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</head>
<style type="text/css">
    body{
        background-color: rgba(0, 231, 68, 0.06);
    }
/*隱藏的編輯面板屬性的樣式*/
    .setPanel{
        top:10%;
        margin-left: 20%;
        margin-right: 20%;
        position: absolute;
        border: solid 1px #000000;
        background-color: rgba(138, 174, 14, 0.5);
        display: none;
    }
    .setElement{
        top:10%;
        margin-left: 20%;
        margin-right: 20%;
        position: absolute;
        border: solid 1px #000000;
        background-color: rgba(138, 174, 14, 0.5);
        display: none;
    }


</style>

<body>
<div class="row">

    <!--表單需要的原件區域開始-->
    <div id="labelContext" class="col-md-3">
       <!-- 樣式選擇開始-->
        <ul class="nav nav-tabs">
            <li value="0" role="presentation" class="active"><a href="#">列表</a></li>
            <li value="1" role="presentation"><a href="#">單行</a></li>
        </ul>
        <!-- 樣式選擇結束-->
            <div class="form-group col-sm-12">
                <label  class="col-sm-4 control-label text-right">文本框</label>
                <div class="col-sm-8">
                   <input type="text" class="form-control"/>
                </div>
            </div>

            <div class="form-group col-sm-12">
                <label  class="col-sm-4 control-label text-right">下拉框</label>
                <div class="col-sm-8">
                    <select class="form-control" >
                        <option>-請選擇-</option>
                    </select>
                </div>
            </div>

            <div class="form-group col-sm-12">
                <label  class="col-sm-4 control-label text-right">日期框</label>
                <div class="col-sm-8">
                    <input type="date" class="form-control"/>
                </div>
            </div>

            <div class="form-group col-sm-12 text-right">
                <label  class="col-sm-4 control-label"></label>
                <div class="col-sm-8">
                    <input type="radio"/>單選框
                </div>
            </div>

            <div class="form-group col-sm-12 text-right">
                <label  class="col-sm-4 control-label"></label>
                <div class="col-sm-8">
                    <input type="checkbox"/>多選框
                </div>
            </div>

            <div class="form-group col-sm-12">
                <label  class="col-sm-4 control-label text-right">文本域</label>
                <div class="col-sm-8">
                    <textarea  class="form-control" style="height: 100px; margin-top: 5px; resize: none;"></textarea>
                </div>
            </div>

            <!--添加標識name="panel"用於實現原件添加的作用域-->
            <div  class="form-group col-sm-12">
                <label  class="col-sm-4 control-label text-right"></label>
                <div class="col-sm-8">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">面板</h3>
                    </div>
                    <div class="panel-body"></div>
                </div>
                </div>
            </div>

            <div class="form-group col-sm-12">
                <label for="inputEmail3" class="col-sm-4 control-label text-right">郵件</label>
                <div class="col-sm-8">
                    <input type="email" class="form-control" id="inputEmail3" placeholder="Email">
                </div>
            </div>

            <div class="form-group col-sm-12">
                <label for="inputPassword3" class="col-sm-4 control-label text-right">密碼框</label>
                <div class="col-sm-8">
                    <input type="password" class="form-control" id="inputPassword3" placeholder="Password">
                </div>
            </div>

    </div>
    <!--表單需要的原件區域結束-->

    <!--表單的顯示區域開始-->
    <div id="formContext" class="col-md-9">
        <form class="form-horizontal">

        </form>
    </div>
    <!--表單的顯示區域結束-->

</div>

<!--表單的設置屬性區域開始-->
<div id="setPanelAttr"  class="setPanel">
    <span class='glyphicon glyphicon-remove' style="float: right" aria-hidden='true'></span>
    <br/>
    <form class="form-horizontal">
        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">ID</label>
            <div class="col-sm-8">
                <input name="id" type="text" disabled="disabled" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">數據表名</label>
            <div class="col-sm-8">
                <input name="table" type="text" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">面板名稱</label>
            <div class="col-sm-8">
                <input name="name" type="text" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">排序</label>
            <div class="col-sm-8">
                <input name="order" type="text" class="form-control" placeholder="預留字段,功能暫時沒有實現"/>
            </div>
        </div>

    </form>
</div>
<!--表單的設置屬性區域結束-->

<!--Element元件設置屬性區域開始-->
<div id="setElementAttr" class="setElement">
    <span class='glyphicon glyphicon-remove' style="float: right" aria-hidden='true'></span>
    <br/>
    <form class="form-horizontal">
        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">ID</label>
            <div class="col-sm-8">
                <input name="id" type="text" disabled="disabled" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">對應字段</label>
            <div class="col-sm-8">
                <input name="column" type="text" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">名稱</label>
            <div class="col-sm-8">
                <input name="name" type="text" class="form-control"/>
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">排序</label>
            <div class="col-sm-8">
                <input name="order" type="text" class="form-control" placeholder="預留字段,功能暫時沒有實現"/>
            </div>
        </div>

        <div class="form-group col-sm-12 text-right">
            <label  class="col-sm-4 control-label"></label>
            <div class="col-sm-8">
                <input  name="required" type="checkbox"/>是否必填
            </div>
        </div>

        <div class="form-group col-sm-12">
            <label  class="col-sm-4 control-label text-right">數據源</label>
            <div class="col-sm-8">
                <textarea name="dataSource"  class="form-control" style="height: 100px; margin-top: 5px; resize: none;"></textarea>
            </div>
        </div>


    </form>

</div>
<!--Element元件設置屬性區域結束-->

</body>
<script type="text/javascript">

   $(function(){

    /*--------------------表單樣式選項觸發事件開始----------------*/
    //全局樣式變量:0代表列表,1代表單行
    var formStyle=0;

    $(".nav  li").click(function () {

        $(".nav  li").removeClass();
        $(this).addClass("active");
        //設置表單樣式的選項
        formStyle=$(this).val();
    });
     /* ========表單樣式選項觸發事件結束========= */

       //全局的原件作用域標識
       var labelScope=null;
       //全局標識,當前有效的panel的id
       var globalPanelId=null;
       //全局存放Panel的數組
       var panels=[];
       //全局存放Element的數組
       var elements=[];

       /*   -------設置點擊原件要添加的作用域開始---------*/
       /*   ==========設置點擊原件要添加的作用域結束===========*/


       /* -----------控制原件區域內的內容點擊放到表單區域開始---------------*/
        $("#labelContext .form-group").click(function(){

            //將當前元素克隆處理
            var label=$(this).clone();
            //判斷是否為面板
            var panelnum=$(this).find(".panel").size();
            //表單容器中是否存在一個面板
            var panelJudge=$("#formContext .panel").size();
            if(!panelJudge){
                if(!panelnum){alert("你必須添加一個面板"); return;}
            }

            //設置刪除圖標,用於刪除元件
            var delIco=$("<span class='glyphicon glyphicon-remove' aria-hidden='true'></span>");
            //為刪除圖標bind刪除事件,刪除父級標簽
            delIco.bind("click",function () {
                //獲取父級元素的id
                var id=$(this).parent().attr("id");

               if(id!="undefined" && id!=null && id!=""){
                   //處理Panel的數組panels的函數delPanel(id)
                   delPanel(id);
                   //刪除Element元件時同時刪除elements數組中的信息
                 delElement(id);
               }

                $(this).parent().remove();
            });
            //設置設置圖標,用於觸發panel屬性編輯頁面,或div
            var setPanelIco=$("<span class='glyphicon glyphicon-wrench' aria-hidden='true'></span>");
            //bind click 事件用於觸發屬性編輯div
            setPanelIco.bind("click",function () {
                //面板顯示
                $("#setPanelAttr").css("display","block");
                //面板的id屬性
                var parentId=$(this).parent().attr("id");
                //獲取下標值
               var panelIndex=parentId.substr(5,parentId.length)-1;
                //將面板的屬性帶到設置屬性的div中
                var panel=panels[panelIndex];

               //在設置面板屬性的input中添加值
                $("#setPanelAttr").find("input[name='id']").val(panel.id);
                $("#setPanelAttr").find("input[name='name']").val(panel.name);
                $("#setPanelAttr").find("input[name='table']").val(panel.table);
                $("#setPanelAttr").find("input[name='order']").val(panel.order);
            });

            if(panelnum){
                //對象化柵格化容器
                var panelmd12=$("<div class='col-md-12'></div>");

                //對面板進行處理,保證面板的顯示為class=col-md-12
                label.find("label").remove();
                label.find(".col-sm-8").removeClass();
                /* 將元件放到表單的區域中*/
                $("#formContext").find("form:first").append(panelmd12.append(label).click(
                    function () {
                        //將點擊的面板作為作用域,作用域為.panel-body的class屬性div
                        labelScope=$(this).find(".panel-body");
                        //作用域標識
                        var span="<span id='labelScope' class='badge'>操作的面板</span>";
                        //通過span標簽顯示為作用域
                        $(".panel").find(".panel-heading").find("span").remove();
                        $(this).find(".panel-heading").prepend(span);
                        //將當前有效的panelId賦值給全局變量globalPanelId
                        globalPanelId=$(this).attr("id");

                    }));
                //創建panelId參數:添加的元件panelmd12
                createPanelId(panelmd12);
                //觸發一次panel的單擊事件
                panelmd12.trigger("click");
                //添加刪除圖標
                panelmd12.append(delIco);
                //添加設置圖標
                panelmd12.append(setPanelIco);

                return;
            }


            //設置設置圖標,用於觸發Element編輯頁面,或div
            var setElementIco=$("<span class='glyphicon glyphicon-wrench' aria-hidden='true'></span>");
            //bind click 事件用於觸發屬性編輯div
            setElementIco.bind("click",function () {
                //面板顯示
                $("#setElementAttr").css("display","block");
                //面板的id屬性
                var parentId=$(this).parent().attr("id");

                //獲取下標值
                var panelIndex=parentId.substr(7,parentId.length)-1;

                //將面板的屬性帶到設置屬性的div中
                var element=elements[panelIndex];

                //在Element設置屬性的input中添加值
                $("#setElementAttr").find("input[name='id']").val(element.Id);
                $("#setElementAttr").find("input[name='name']").val(element.name);
                $("#setElementAttr").find("input[name='column']").val(element.column);
                $("#setElementAttr").find("input[name='order']").val(element.order);
                $("#setElementAttr").find("input[name='required']").val(element.required);
                $("#setElementAttr").find("textarea[name='dataSource']").val(element.dataSource);
            });


            //判斷是否為文本域
          if(formStyle){
              //創建柵格化容器
              var md12=$("<div class='col-md-12'></div>");
              //改變label選擇元件的柵格化布局
              label.find(".col-sm-4").addClass("col-sm-2");
              label.find(".col-sm-8").addClass("col-sm-10");
              label.find(".col-sm-4").removeClass("col-sm-4");
              label.find(".col-sm-8").removeClass("col-sm-8");
              //消除微小的差距導致無法對齊的bug
              label.css("margin-left","-25px");
              /* 將元件放到表單的區域中*/
              labelScope.append(md12.append(label));
              //創建element的ID和默認名稱
             createElementId(md12);
              //添加刪除圖標
              md12.append(delIco);
              //添加設置圖標
              md12.append(setElementIco);
          return;
          }
            //創建柵格化容器
            var md6=$("<div class='col-md-6'></div>");
           /* 將元素方到表單的區域中*/
            labelScope.append(md6.append(label));
            //將刪除的圖標添加到創建柵格化容器
            //創建element的ID和默認名稱
            createElementId(md6);
            md6.append(delIco);
            //添加設置圖標
            md6.append(setElementIco);
        });

       /* =====================控制原件區域內的內容點擊放到表單區域結束=================*/

      /* ------------生成panel的id屬性和Panel對象類開始--------------*/
      //定義panel類
      /* 參數說明:id:唯一標識;
      name:顯示名稱;
      table:對應的表;
      flow:對應的模板;
      order:顯示順序;
      context:panel中的元件json數據*/
       function Panel(id,name,table,flow,order,context){
            this.id=id;
            this.name=name;
            this.table=table;
            this.flow=flow;
            this.order=order;
            this.context=context;
       }
       //創建panelId參數:添加的元件panelmd12
        function createPanelId(panelmd12) {
            //為數組長度基礎上默認+1,作為id和面板的區別數字
            var panelsLength=panels.length+1;
            //設置面板的名字
            panelmd12.find("h3").text("面板"+panelsLength);
            //panel添加成功后為panel指定唯一的id和設置相關默認屬性
            panels.push(new Panel("panel"+panelsLength,"面板"+panelsLength,"","","",""));
            panelmd12.attr("id","panel"+panelsLength);

        }
       //處理Panel的數組panels
       function  delPanel(id) {
        //判斷是否為panel
           if(id.substr(0,5)=="panel"){
                //在數組中刪除panel信息,但保留占位
               delete panels[id.substr(5,id.length)-1];
           }
       }

     /* =============生成panel的id屬性結束================*/

    /*---------------設置panel屬性div的關閉事件開始--------------------*/
        //面板屬性設置div,在隱藏時同時將編輯的數據保存到panels數組中
       $("#setPanelAttr .glyphicon-remove").click(function () {
           //隱藏屬性編輯div
           $(this).parent().css("display","none");
           //獲取面板的id用於獲取Panel對象存放在panels數組中的下標
           var panelId=$(this).parent().find("input[name='id']").val();
           var panelIndex=panelId.substr(5,panelId.length)-1;
           //面板的新名稱
           var panelName=$(this).parent().find("input[name='name']").val();
           //將編輯好的值存放到panels數組中
            panels[panelIndex]=new Panel($(this).parent().find("input[name='id']").val(),
                panelName,
                $(this).parent().find("input[name='table']").val(),"",
                $(this).parent().find("input[name='order']").val(),"");
            //改變面板顯示名稱
           $("#"+panelId).find("h3").text(panelName);

       });


   /*    =========設置panel屬性div的關閉事件結束=============*/

       /* ----------設置element屬性和element的id開始----------*/
      /* Element是元件對象屬性有:
       panelId:對應面板的Id;
       Id:元件的id;
       column:對應數據庫字段;
       required:必填選項;
       dataSource:元件顯示的數據源;*/
       function Element(panelId,Id,name,column,required,order,dataSource) {
           this.panelId=panelId;
           this.Id=Id;
           this.name=name;
           this.column=column;
           this.required=required;
           this.order=order;
           this.dataSource=dataSource;

       }

       //創建element的ID和默認名稱,md元件自身,labelScope元件所在的panel
       function  createElementId(md) {
           //獲取elements數組的長度,在+1的基礎上作為元件的ID
           var elementLength=elements.length+1;
           md.attr("id","element"+elementLength);
           //將Element元件的信息添加到elements數組中
           elements.push(new Element(globalPanelId,"element"+elementLength,"","","","",""));

       }
       //刪除Element元件時同時刪除elements數組中的信息
       function delElement(id) {
           /*判斷是否為element*/
           if(id.substr(0,7)=="element"){
               //在elements數組中刪除Element信息,但保留占位
               delete elements[id.substr(7,id.length)-1];
           }


       }


       /*=======設置element屬性和element的id結束========*/

      /* -------------設置Element編輯div的關閉事件開始--------------*/
       //面板屬性設置div,在隱藏時同時將編輯的數據保存到elements數組中
       $("#setElementAttr .glyphicon-remove").click(function () {
           //隱藏屬性編輯div
           $(this).parent().css("display","none");
           //獲取Element的id用於獲取Element對象存放在elements數組中的下標
           var elementId=$(this).parent().find("input[name='id']").val();
           var elementIndex=elementId.substr(7,elementId.length)-1;
           //元件的新名稱
           var elementName=$(this).parent().find("input[name='name']").val();
           //將編輯好的值存放到elements數組中
           elements[elementIndex]=new Element(globalPanelId,$(this).parent().find("input[name='id']").val(),
               elementName,
               $(this).parent().find("input[name='column']").val(),
               $(this).parent().find("input[name='required']").val(),
               $(this).parent().find("input[name='order']").val(),
               $(this).parent().find("textarea[name='dataSource']").val());
           //改變元件顯示名稱
           $("#"+elementId).find("h3").text(panelName);

       });
      /* =============設置Element編輯div的關閉事件結束===================*/

   });



</script>

</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM