简体   繁体   English

表单字段值未正确传递到JSON对象中

[英]Form field values are not getting passed into JSON object correctly

This is my JSFiddle : https://jsfiddle.net/inchrvndr/7pwh9p8g/ 这是我的JSFiddle: https ://jsfiddle.net/inchrvndr/7pwh9p8g/

The bordered form elements get cloned on click of "+" button. 

The values of all the cloned form elements are getting passed into JSON except for the parent whose clone is being made. 所有克隆表单元素的值都将传递到JSON中,但要进行克隆的父对象除外。

On clicking "Save" button, you can see the alert for JSON object of all form field values except for the first bordered div. 单击“保存”按钮后,您可以看到除第一个带边框的div以外的所有表单字段值的JSON对象警报。

Why is this so? 为什么会这样呢? Please help. 请帮忙。 Thanks :) 谢谢 :)

try this.. 尝试这个..

UPDATE: 更新:

you have duplicate elements, like this one: id="op" there can be only one ID unique on page.. I suggest that you drop id's or generate them 您有重复的元素,例如: id="op" ,页面上只能有一个唯一的ID。我建议您删除ID或生成它们

 $( document ).ready(function() { $('#deleteRow').closest('.form-group').hide(); $('#addRow').on('click', function (e) { var len = $('.child-border').length; $('.parent-border-repeat').clone().find(':input').each(function (idx, ele) { ele.name = ele.name + len; ele.id = ele.id + len; ele.value = ''; }).end().find('.form-group').toggle(true).end() .toggleClass('parent-border-repeat child-border').hide() .appendTo('#container').slideDown('slow'); }); $('button.btn:contains("Save")').on('click', function (e) { var jsonData = $('form.form-horizontal') .find(':input:not(button)').get() .reduce(function (acc, ele) { acc[ele.id] = ele.value; return acc; }, {}); // console.log(jsonData); alert(JSON.stringify(jsonData, null, 4)); }); $('#container').on('click', '[id^=deleteRow]', function(e) { var jsonData = $(this).closest('.child-border, .parent-border-repeat') .find(':input:not(button)').get() .reduce(function (acc, ele) { acc[ele.name || ele.id] = ele.value; return acc; }, {}); $(this).closest('.child-border, .parent-border-repeat').remove(); console.log(jsonData); }); }); 
 .navbar-nav li { margin-top: 8px; margin-bottom: 8px; } .tabs-container { margin-top: 100px; margin-bottom: 75px; } .parent-border-repeat{ display: none; } .parent-border, .child-border { border: 1px solid #CCC; border-radius: 4px; padding: 15px; margin-bottom: 15px; } .btn-circle.btn-lg { width: 50px; height: 50px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 25px; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header pull-right"> <ul class="nav navbar-nav"> <li> <button class="btn btn-md btn-success">Login</button> </li> </ul> </div> </div> </nav> <div class="container"> <div class="row tabs-container"> <div class="col-sm-offset-2 col-sm-8"> <div class="panel with-nav-tabs panel-default"> <div class="panel-heading"> <ul class="nav nav-tabs"> <li class="active"> <a href="#tab1default" data-toggle="tab">Rules</a> </li> <li> <a href="#tab2default" data-toggle="tab">Events</a> </li> </ul> </div> <div class="panel-body"> <div class="tab-content"> <div class="tab-pane fade in active" id="tab1default"> <form class="form-horizontal"> <div class="form-group"> <label class="control-label col-sm-2" for="nameRules">Name:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="nameRules" name="nameRules" placeholder="Enter name"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="typeRules">Type:</label> <div class="col-sm-10"> <select class="form-control" id="typeRules" name="typeRules"> <option>Type1</option> <option>Type2</option> <option>Type3</option> <option>Type4</option> </select> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="descriptionRules">Description:</label> <div class="col-sm-10"> <textarea class="form-control" rows="4" cols="50" name="descriptionRules">XYZ</textarea> </div> </div> <div class="parent-border col-sm-offset-2 col-sm-10"> <div class="form-group"> <div class="col-sm-offset-10"> <button type="button" id="deleteRow" class="btn btn-danger btn-circle btn-lg"> <i class="glyphicon glyphicon glyphicon-trash"></i> </button> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="elhs">Expression LHS:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="elhss" name="elhs" placeholder="Enter LHS" name="lhs"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="op">Operator</label> <div class="col-sm-10"> <select class="form-control" id="opp" name="op"> <option> <=</option> <option>>=</option> <option>!==</option> <option> <</option> <option>></option> <option>==</option> </select> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="erhs">Expression RHS:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="erhss" name="erhs" placeholder="Enter RHS" name="rhs"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="datatype">Datatype:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="datatypee" name="datatype" placeholder="Enter datatype" name="datatype"></div> </div> </div> <div class="parent-border-repeat col-sm-offset-2 col-sm-10"> <div class="form-group"> <div class="col-sm-offset-10"> <button type="button" id="deleteRow" class="btn btn-danger btn-circle btn-lg"> <i class="glyphicon glyphicon glyphicon-trash"></i> </button> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="joinop">Join Operator</label> <div class="col-sm-10"> <select class="form-control" id="joinopp"> <option>&&</option> <option>||</option> </select> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="elhs">Expression LHS:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="elhs" name="elhs" placeholder="Enter LHS" name="lhs"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="op">Operator</label> <div class="col-sm-10"> <select class="form-control" id="opp" name="op"> <option> <=</option> <option>>=</option> <option>!==</option> <option> <</option> <option>></option> <option>==</option> </select> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="erhs">Expression RHS:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="erhs" name="erhs" placeholder="Enter RHS" name="rhs"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="datatype">Datatype:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="datatype" name="datatype" placeholder="Enter datatype" name="datatype"></div> </div> </div> <div id="container"></div> <div class="form-group"> <div class="col-sm-offset-6"> <button type="button" id="addRow" class="btn btn-success btn-circle btn-lg"> <i class="glyphicon glyphicon-plus"></i> </button> </div> </div> </form> </div> <div class="tab-pane fade" id="tab2default"> <form class="form-horizontal"> <div class="form-group"> <label class="control-label col-sm-2" for="nameEvents">Name:</label> <div class="col-sm-10"> <input type="text" class="form-control" id="nameEvents" name="nameEvents" placeholder="Enter name"></div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="typeRules">Type:</label> <div class="col-sm-10"> <select class="form-control" id="typeRules" name="typeRules"> <option>Type1</option> <option>Type2</option> <option>Type3</option> <option>Type4</option> </select> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="descriptionEvents">Description:</label> <div class="col-sm-10"> <textarea class="form-control" rows="4" cols="50" name="descriptionEvents">XYZ</textarea> </div> </div> </form> </div> </div> </div> </div> </div> </div> <!-- /.container --> <div class="navbar navbar-inverse navbar-fixed-bottom"> <div class="container"> <div class="navbar-footer pull-right"> <ul class="nav navbar-nav"> <li> <button class="btn btn-md btn-success">Save</button> </li> </ul> </div> </div> </div> </div> 

I have solved this issue. 我已经解决了这个问题。

Here is the answered fiddle : AnswerFiddle 这是答案的小提琴: AnswerFiddle

I added the Join Operator into the same "to-be-cloned" div and hid its div before cloning.

It becomes visible after cloning, that is, after clicking on, "+" button. 克隆后,即单击“ +”按钮后,它变为可见。 Now, all of the before clone and after cloned form fields' values are getting passed into the JSON. 现在,所有之前的克隆和克隆后的表单字段的值都将传递到JSON中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM