我使用jquery创建了一些动态元素,并在动态元素中使用ajax添加下拉列表,问题是当我从下拉列表中选择一个选项时,即将发布的ajax数据将覆盖所有其他动态元素数据。
现在我想在jquery中分别绑定每个动态元素数据的数据。
$(document).ready(function() {
var html = $("#dsp > .row:first").first().html();
var maxrows = 5;
var x = 1;
$("#addrow").click(function() {
if (x <= maxrows) {
$('#dsp').append(html);
x++;
}
});
$("#rmvrow").click(function() {
$('#dsp').children().last().remove();
});
$('#dsp').on('change','.p_name',function(){
var pid=$(this).val();
var parent=$('#dsp');
//alert(pid);
$.ajax({
url:"{{route('getinfo')}}",
method:'post',
data:{id:pid,'_token':"{{csrf_token()}}"},
success:function(response) {
console.log(parent.find('.p_code').val(response.code));
}
});
});
});
<div id="dsp">
<div class="row">
<div class="col-md-2">
<select name="p_name[]" class="form-control p_name">
<option value="">-Select Product-</option>
@foreach($products as $product)
<option value="{{$product->product_id}}">{{$product->name}}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<input type="text" name="p_code[]" class="form-control p_code">
</div>
<div class="col-md-2">
<input type="text" name="unit_pctn[]" class="form-control unit_pctn" readonly="">
</div>
<div class="col-md-2">
<input type="text" name="u_price[]" class="form-control u_price" readonly="">
</div>
<div class="col-md-1">
<input type="text" name="ctn[]" class="form-control ctn">
</div>
<div class="col-md-1">
<input type="text" name="pcs[]" class="form-control pcs">
</div>
<div class="col-md-2">
<input type="text" name="t_amt[]" class="form-control t_amt">
</div>
</div><br>
</div>
继续为每个行提供动态ID,并使用它来添加侦听器。
在每个添加行上调用一个函数
function addrow(rownumber) {
document.getElementById('dsp' + rownumber).addEventListener('click', function(event) {
// do some action
});
}
您委派事件绑定的代码很好。问题是你的第二个success
函数没有将响应放在当前行中,它填充所有.u_price
字段。改为:
parent.find(".u_price").val(response.client_price);
当你添加一个新行时,它需要在它自己的<div class="row">
中,这样$(this).closest(".row")
将选择正确的行。你现在只有一个class="row"
,它是包含所有行的#dsp
DIV。每一行都需要是#dsp
的孩子。
$(document).ready(function() {
var html = $("#dsp > row:first").first().html();
var maxrows = 5;
var x = 1;
$("#addrow").click(function() {
if (x <= maxrows) {
$('#dsp').append(html);
x++;
}
});
$("#rmvrow").click(function() {
$('#dsp').children().last().remove();
});
});
<div id="dsp">
<div class="row">
<div class="col-md-2">
<select name="p_name[]" class="form-control p_name">
<option value="">-Select Product-</option>
@foreach($products as $product)
<option value="{{$product->product_id}}">{{$product->name}}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<input type="text" name="p_code[]" class="form-control p_code">
</div>
<div class="col-md-2">
<input type="text" name="unit_pctn[]" class="form-control unit_pctn" readonly="">
</div>
<div class="col-md-2">
<input type="text" name="u_price[]" class="form-control u_price" readonly="">
</div>
<div class="col-md-1">
<input type="text" name="ctn[]" class="form-control ctn">
</div>
<div class="col-md-1">
<input type="text" name="pcs[]" class="form-control pcs">
</div>
<div class="col-md-2">
<input type="text" name="t_amt[]" class="form-control t_amt">
</div>
</div>
</div>
试试这种方式。以这种方式工作的数据并计算总数也有效。
$(document).ready(function(){
$('#dsp').on('change','.p_name',function(){
var pid=$(this).val();
var parent= $(this).closest('.row');
//alert(pid);
$.ajax({
url:"{{route('getinfo')}}",
method:'post',
data:{id:pid,'_token':"{{csrf_token()}}"},
success:function(response) {
//alert(response.code);
parent.find('.p_code').val(response.code);
parent.find('.unit_pctn').val(response.pcs_per_ctn);
}
});
$.ajax({
url:"{{route('getprice')}}",
method:'post',
data:{id:pid,'_token':"{{csrf_token()}}"},
success:function(response) {
//alert(response.code);
parent.find('.u_price').val(response.client_price);
}
});
});
//calculation here
$('#dsp').on('input','.ctn',function(){
var cal=$(this).val();
var gparent=$(this).closest('.row');
var unitp=gparent.find('.u_price').val();
var unitpctn=gparent.find('.unit_pctn').val();
var pcs=gparent.find('.pcs').val();
//alert(pcs);
var total=(((parseInt(unitpctn)*parseInt(cal)) + parseInt(pcs))*parseInt(unitp));
gparent.find('.t_amt').val(total);
//grand total
var gtotal=0;
var gtotal=parseInt(gtotal)+parseInt(total)
//alert(gtotal);
$('#tot').val(gtotal);
});
$('#dsp').on('input','.pcs',function(){
var pcs=$(this).val();
var gparent=$(this).closest('.row');
var unitp=gparent.find('.u_price').val();
var unitpctn=gparent.find('.unit_pctn').val();
var ctn=gparent.find('.ctn').val();
//alert(pcs);
var total=(((parseInt(unitpctn)*parseInt(ctn)) + parseInt(pcs))*parseInt(unitp));
gparent.find('.t_amt').val(total);
//grand total
var gtotal=0;
$('.t_amt').each(function(){ gtotal += parseFloat($(this).val()) || 0; $('#tot').val(gtotal); });
});
});