在表单中添加自动完成功能的行会中断

时间:2017-02-20 07:52:01

标签: javascript jquery html-datalist

在表格中,我有2个输入。在第一个输入中,我使用datalist我通过JSON加载它,第二个输入在第一个输入更改时自动完成。 直到这里所有的作品!

然后我添加了一个添加按钮,我添加相同的行。问题是,因为我使用id来选择输入,当我添加新行时,我有相同的ID ..所以自动完成功能不起作用..

我该如何解决这个问题?这里是jssFiddle



counter = 0;
var dataList = document.getElementById('products');
var jsonOptions = [{
  "product": "11111",
  "description": "description 1"
}, {
  "product": "22222",
  "description": "description 2"
}, {
  "product": "33333",
  "description": "description 3"
}];

jsonOptions.forEach(function(item) {

  var option = document.createElement('option');

  option.value = item.product;
  option.text = item.description;

  dataList.appendChild(option);


  $(function() {
    $('#product').on('change keyup', function() {

      var i = this.value;
      var description = "";
      var productsInBox = 0;

      jsonOptions.forEach(function(a) {
        if (a.product == i) {
          description = a.description;
          productsInBox = a.productsInBox;
        }
      });
      $('#description').val(description);


    });
  });

});



$('#form1')
  // Add button click handler
  .on('click', '.addButtonDED', function() {
    counter++;
    var $template = $('#addLineInDed'),
      $clone = $template
      .clone()
      .removeClass('hide')
      .removeAttr('id')
      .attr('data-index', counter)
      .insertBefore($template);

    // Update the name attributes
    $clone
      .find('[name="product"]').attr('name', 'product-' + counter).end()
      .find('[name="description"]').attr('name', 'description-' + counter).end()


  })

  // Remove button click handler
  .on('click', '.removeButtonDED', function() {
    var $row = $(this).parents('.form-group'),
      index = $row.attr('data-index');
    counter--;
    // Remove element containing the fields

    $row.remove();
  });

<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form id="form1" method="post" class="form-horizontal" role="form">
  <fieldset>


    <div class="form-group">
      <div class="col-xs-2">
        <input type="text" id="product" list="products" class="form-control" name="product-0" />
        <datalist id="products"></datalist>
      </div>

      <div class="col-xs-4">
        <input id="description" type="text" class="form-control" name="description-0" />
      </div>



      <div class="col-xs-1">
        <button type="button" class="btn btn-default addButtonDED"><i class="fa fa-plus"></i></button>
      </div>
    </div>


    <div id="addLineInDed" class="form-group hide">
      <div class="form-group">
        <div class="col-xs-2">
          <input type="text" id="product" list="products" class="form-control" name="product-0" />
          <datalist id="products"></datalist>
        </div>

        <div class="col-xs-4">
          <input id="description" type="text" class="form-control" name="description-0" />
        </div>


        <div class="col-xs-1">
          <button type="button" class="btn btn-default removeButtonDED"><i class="fa fa-minus"></i></button>
        </div>
      </div>
    </div>


   <div class="col-md-10 ">
       <button type="submit" name="formAction" value="next" class="btn btn-primary">Submit</button> 
    </div>

  </fieldset>
</form>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

使用类,将您的选择重命名为数组值:

counter = 0;
var dataList = $('.products');
var jsonOptions = [{
  "product": "11111",
  "description": "description 1"
}, {
  "product": "22222",
  "description": "description 2"
}, {
  "product": "33333",
  "description": "description 3"
}];

jsonOptions.forEach(function(item) {

  var option = '<option value="' + item.product + '">' + item.description + '</option>';

  dataList.append(option);
});

$(function() {
  $('body').on('input', '.product,.products', function() {

    var i = this.value;
    var description = "";
    var productsInBox = 0;

    jsonOptions.forEach(function(a) {
      if (a.product == i) {
        description = a.description;
        productsInBox = a.productsInBox;
      }
    });
    $(this).closest('.form-group').find('.description').val(description);


  });
});





$('#form1').on('click', '.addButtonDED', function() {
    var $template = $('.form-group:last').clone(true, true).find('input').val('').end()
    .find('.addButtonDED').removeClass('addButtonDED').addClass('removeButtonDED').end()
    .find('i').removeClass('fa-plus').addClass('fa-minus').end();
    $template.insertAfter('.form-group:last');
  })

  // Remove button click handler
  .on('click', '.removeButtonDED', function() {
    var $row = $(this).closest('.form-group');
    $row.remove();
  });
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form1" method="post" class="form-horizontal" role="form">
  <fieldset>


    <div class="form-group">
      <div class="col-md-2">
        <input type="text" list="products" class="form-control product" name="product[]" />
        <datalist id="products" class="products"></datalist>
      </div>

      <div class="col-md-4">
        <input id="" type="text" class="form-control description" name=" description[]" />
      </div>



      <div class="col-md-1">
        <button type="button" class="btn btn-default addButtonDED"><i class="fa fa-plus"></i></button>
      </div>
    </div>

    <div class="col-md-10 ">
      <button type="submit" name="formAction" value="next" class="btn btn-primary">sUBMIT</button>

    </div>



  </fieldset>
</form>

</fieldset>
</form>

读取值进行循环:

foreach($_POST['product'] as $product) {
 //do stuf
}

答案 1 :(得分:0)

看到你说你已经尝试过使用课程,

如何封装你的代码,以便你有这样的功能: function FilldatalistOptions(element,options)

然后,您可以拥有2个不同ID的数据列表(也许是products1和products2)。 只需像这样调用函数:

var dataList1 = document.getElementById('products1');
var dataList2 = document.getElementById('products2');
FilldatalistOptions(datalist1, jsonOptions);
FilldatalistOptions(datalist2, jsonOptions);