jQuery hide()不适用于bootstrap动态表单

时间:2017-04-11 17:45:57

标签: jquery forms twitter-bootstrap

我在bootstrap中有一个动态表单,我想根据选择使用不同的字段向其添加表单。如果选定的选项是球体,则表单应包含直径,位置,颜色和材质字段,如果是三角形,则需要添加其他字段(如图所示)。我试图隐藏我不需要使用jQuery hide()添加的字段,但它不起作用。如果您让我知道我的代码有什么问题,我将不胜感激。

image of the form

HTML:

<div class="row" id="dynamic_form">
  <div class="form-group form-horizontal">
    <label class="control-label">Primitives</label>
    <div class="form-inline">
      <select class="input-small form-control" id="primitive-selector" name="PrimitiveChoose[]">
          <!-- <option value=" " disabled="" selected="">primitive</option> -->
          <option value="sphere">sphere</option>
          <option value="triangle">triangle</option>
      </select>
      <input type="number" class="input-small form-control" id="diameter" name="Diameter[]" step="any" placeholder="diameter(D)">

      <input type="text" class="input-small form-control" id="sphere-position" name="SpherePosition[]" placeholder="(x, y, z)">

      <select class="input-small form-control" id="material-selector" name="MaterialSelect[]">
          <option value=" " disabled="" selected="">material</option>
          <option value="normal">opaque</option>
          <option value="glass">glass</option>
          <option value="mirror">mirror</option>
      </select>
      <select class="input-small form-control" id="circle-color-selector" name="CircColorSelect[]">
          <option value=" " disabled="" selected="">color</option>
          <option value="red">red</option>
          <option value="blue">blue</option>
          <option value="green">green</option>
          <option value="yellow">yellow</option>
      </select>

      <button type="button" class="btn btn-success btn-add" id="add_more"> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
      </button>
    </div>
  </div>
</div>

JavaScript的:

function getHTMLString(formCount) {
    var complex_html = [
              '<div class="form-inline">',
                '<select class="input-small form-control" id="primitive-selector'+ formCount +'" name="PrimitiveChoose[]">',
                  '<option value=" " disabled selected>primitive</option>',
                  '<option value="sphere">sphere</option>',
                  '<option value="triangle">triangle</option>',
                '</select> ',
                '<input type="number" class="input-small form-control" id="diameter'+ formCount +'"  name="Diameter[]" step="any" placeholder="diameter(D)"> ',
                '<input type="text" class="input-small form-control"  id="sphere-position'+ formCount +'" name="SpherePosition[]"  placeholder="(x, y, z)"> ',
                '<input type="text" class="input-small form-control" id="A-position'+ formCount +'" name="VerticeAPosition[]" placeholder="(x, y, z)"> ',
                '<input type="text" class="input-small form-control" id="B-position'+ formCount +'" name="VerticeBPosition[]" placeholder="(x, y, z)"> ',
                '<input type="text" class="input-small form-control" id="C-position'+ formCount +'" name="VerticeCPosition[]" placeholder="(x, y, z)"> ',

                '<select class="input-small form-control" id="circle-color-selector'+ formCount +'" name="CircColorSelect[]">',
                  '<option value=" " disabled selected>color</option>',
                  '<option value="red">red</option>',
                  '<option value="blue">blue</option>',
                  '<option value="green">green</option>',
                  '<option value="yellow">yellow</option>',    
                '</select> ', 
                '<button type="button" class="btn btn-success btn-add" id="remove_more'+formCount+'"> <span class="glyphicon glyphicon-minus" aria-hidden="true"></span>',
                '</button>',  
            '</div>',
    ].join('');
    return complex_html;
}
$(document).ready(function() {
    var formCount = 0;
    $('#add_more').on('click', function(e) {
        if (formCount < 4) { 
            var html = getHTMLString(formCount);
            var element = $(html);
            $('#dynamic_form  .form-group').append(html);
            $('#primitive-selector'+formCount).on('change', function(){
                if($(this).val() === "sphere"){
                    $('#A-position'+ formCount).hide();
                    $('#B-position'+ formCount).hide();
                    $('#C-position'+ formCount).hide();
                } else {
                    $('#diameter'+ formCount).hide();
                    $('#sphere-position'+ formCount).hide();
                }

            });

        } else {
            return;     
        }
        formCount++;
    });


    $('#dynamic_form').on("click","#remove_more"+formCount, function(e){ //user click on remove text
        e.preventDefault(); $(this).parent('div').remove(); formCount--;

    });
});

2 个答案:

答案 0 :(得分:1)

而是添加更改事件处理程序:

$('#primitive-selector'+formCount).on('change', function(){

内部:

$('#add_more').on('click', function(e) {

您可以作为委派活动直接附加到文档:

$(document).on('change', '[id^=primitive-selector]', function(e) {
    var formCount = this.id.replace('primitive-selector', '');

    var TselectorString = '#A-position'+ formCount + ', #B-position'+ formCount +
            ', #C-position'+ formCount;
    var SselectorString = '#diameter'+ formCount + ', #sphere-position'+ formCount +
            ', #material-selector'+ formCount + ', #circle-color-selector'+ formCount
    var bIsS = $(this).val() === "sphere";
    $(SselectorString).toggle(bIsS);
    $(TselectorString).toggle(!bIsS);
});

以同样的方式委派remove事件。

我使用了jQuery Attribute Starts With Selector [name^=”value”]而不是id。

摘录:

&#13;
&#13;
function getHTMLString(formCount) {
    var complex_html = [
        '<div class="form-inline">',
        '<select class="input-small form-control" id="primitive-selector'+ formCount +'" name="PrimitiveChoose[]">',
        '<option value=" " disabled selected>primitive</option>',
        '<option value="sphere">sphere</option>',
        '<option value="triangle">triangle</option>',
        '</select> ',
        '<input type="number" class="input-small form-control" id="diameter'+ formCount +'"  name="Diameter[]" step="any" placeholder="diameter(D)"> ',
        '<input type="text" class="input-small form-control"  id="sphere-position'+ formCount +'" name="SpherePosition[]"  placeholder="(x, y, z)"> ',
        '<input type="text" class="input-small form-control" id="A-position'+ formCount +'" name="VerticeAPosition[]" placeholder="(x, y, z)"> ',
        '<input type="text" class="input-small form-control" id="B-position'+ formCount +'" name="VerticeBPosition[]" placeholder="(x, y, z)"> ',
        '<input type="text" class="input-small form-control" id="C-position'+ formCount +'" name="VerticeCPosition[]" placeholder="(x, y, z)"> ',

        '<select class="input-small form-control" id="material-selector'+ formCount +'" name="MaterialSelect[]">',
        '<option value=" " disabled="" selected="">material</option>',
        '<option value="normal">opaque</option>',
        '<option value="glass">glass</option>',
        '<option value="mirror">mirror</option>',
        '</select>',

        '<select class="input-small form-control" id="circle-color-selector'+ formCount +'" name="CircColorSelect[]">',
        '<option value=" " disabled selected>color</option>',
        '<option value="red">red</option>',
        '<option value="blue">blue</option>',
        '<option value="green">green</option>',
        '<option value="yellow">yellow</option>',
        '</select> ',
        '<button type="button" class="btn btn-success btn-add" id="remove_more'+formCount+'"> <span class="glyphicon glyphicon-minus" aria-hidden="true"></span>',
        '</button>',
        '</div>',
    ].join('');
    return complex_html;
}

var formCount = 0;

$(document).on("click", "[id^=remove_more]", function(e){ //user click on remove text
    e.preventDefault();
    $(this).closest('div.form-inline').remove();
    formCount--;
});


$(document).on('change', '[id^=primitive-selector]', function(e) {
    if (this.id == 'primitive-selector') {
        //return;
    }
    var formCount = this.id.replace('primitive-selector', '');

    var TselectorString = '#A-position'+ formCount + ', #B-position'+ formCount +
            ', #C-position'+ formCount;
    var SselectorString = '#diameter'+ formCount + ', #sphere-position'+ formCount +
            ', #material-selector'+ formCount + ', #circle-color-selector'+ formCount
    var bIsS = $(this).val() === "sphere";
    $(SselectorString).toggle(bIsS);
    $(TselectorString).toggle(!bIsS);
});


$(document).ready(function() {
    $('[name^="VerticeCPosition"]').hide();
    $('#add_more').on('click', function(e) {
        if (formCount < 4) {
            var html = getHTMLString(formCount);
            var element = $(html);
            $('#dynamic_form  .form-group').append(html);
        } else {
            return;
        }
        formCount++;
    });
});
&#13;
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


<div class="row" id="dynamic_form">
    <div class="form-group form-horizontal">
        <label class="control-label">Primitives</label>
        <div class="form-inline">
            <select class="input-small form-control" id="primitive-selector" name="PrimitiveChoose[]">
                <!-- <option value=" " disabled="" selected="">primitive</option> -->
                <option value="sphere">sphere</option>
                <option value="triangle">triangle</option>
            </select>
            <input type="number" class="input-small form-control" id="diameter" name="Diameter[]" step="any" placeholder="diameter(D)">

            <input type="text" class="input-small form-control" id="sphere-position" name="SpherePosition[]" placeholder="(x, y, z)">

            <input type="text" class="input-small form-control" id="A-position" name="VerticeAPosition[]" placeholder="(x, y, z)">
            <input type="text" class="input-small form-control" id="B-position" name="VerticeBPosition[]" placeholder="(x, y, z)">
            <input type="text" class="input-small form-control" id="C-position" name="VerticeCPosition[]" placeholder="(x, y, z)">

            <select class="input-small form-control" id="material-selector" name="MaterialSelect[]">
                <option value=" " disabled="" selected="">material</option>
                <option value="normal">opaque</option>
                <option value="glass">glass</option>
                <option value="mirror">mirror</option>
            </select>
            <select class="input-small form-control" id="circle-color-selector" name="CircColorSelect[]">
                <option value=" " disabled="" selected="">color</option>
                <option value="red">red</option>
                <option value="blue">blue</option>
                <option value="green">green</option>
                <option value="yellow">yellow</option>
            </select>

            <button type="button" class="btn btn-success btn-add" id="add_more"> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
            </button>
        </div>
    </div>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

hide()方法工作得很好,你在那里的逻辑是错误的。

$(document).ready(function() {
    var formCount = 0;
    $('#add_more').on('click', function(e) {
        formCount++;
        if (formCount < 4) { 
            var html = getHTMLString(formCount);
            var element = $(html);
            $('#dynamic_form  .form-group').append(html);
            $(document).on('change','#primitive-selector'+formCount-1, function(){
                console.log('change...' + $(this).val() + ' ' + '#A-position'+ formCount);
                if($(this).val() === "sphere"){
                    $('#A-position'+ formCount).hide();
                    $('#B-position'+ formCount).hide();
                    $('#C-position'+ formCount).hide();
                } else {
                    $('#diameter'+ formCount).hide();
                    $('#sphere-position'+ formCount).hide();
                }

            });

        } else {
            return;     
        }
    });

看看以下小提琴。它与你提供的代码和修正工作(种类)。 https://jsfiddle.net/hdp513yq/