2017-02-20 93 views
0

在窗体中我有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>

+0

如果您在使用类别ID时遇到问题:)) – madalinivascu

+0

我试图用类替换id,但是当我更改第一个输入时,然后所有更改。 – yaylitzis

+0

请参阅下面的答案 – madalinivascu

回答

1

使用类,重命名selecs数组值:

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 
} 
+0

有2个问题。 1.在新行中,每个输入都有一个属性'name =“product []”'。所以我无法从服务器端读取值。2.如果您在这里看到https://jsfiddle.net/vr7etpLr/,新行将被添加到提交按钮下。 – yaylitzis

+0

@yaylitzis 1.您可以阅读值使用循环2.请参阅https://jsfiddle.net/vr7etpLr/1/ – madalinivascu

+0

好的!非常感谢!最后一件事!删除按钮不存在.. – yaylitzis

0

,你说你已经尝试使用类来看,

如何封装你的代码,让你有一个像这样的功能: 功能FilldatalistOptions(元,options)

然后,您可以使用不同编号的id(产品1和产品2)的2个数据列表。 并调用函数如下所示:

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

如果知道行的总数,您的解决方案将工作。在我看来,我不知道用户会按多少次添加按钮。 – yaylitzis

+0

@yaylitzis我明白了。如果你可以控制'AddLine'方法,你也可以让它更新一个全局变量(可以说lineCount ++)并用'id ='products'+ lineCount'生成新的数据列表。这样你会有个人动态生成的ID。你也会知道你总共有多少数据分析师。 – Shtut