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

时间:2017-05-30 04:56:33

标签: javascript jquery html css json

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

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

除了正在进行克隆的父级之外,所有克隆表单元素的值都将传递到JSON。

单击“保存”按钮,您可以看到除第一个边界div之外的所有表单字段值的JSON对象警报。

为什么会这样?请帮忙。     谢谢:))

2 个答案:

答案 0 :(得分:0)

试试这个..

更新:

你有重复的元素,比如这个: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>

答案 1 :(得分:0)

我已经解决了这个问题。

以下是回答的小提琴:AnswerFiddle

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

克隆后,即点击后,“+”按钮变为可见。 现在,所有前克隆和克隆后的表单字段的值都会传递给JSON。

相关问题