#javascript #html #jquery
Вопрос:
пожалуйста, помогите мне решить эту проблему, у меня есть входное значение (вес), сгенерированное jQuery, я знаю, что оно не изменит свое значение из-за цикличности в моем коде, но есть ли другой способ сделать это ? Цель состоит в том, что я хочу автоматически сгенерировать входное значение веса, но я также могу его изменить.
если фрагмент не работает, вот ссылка : https://jsfiddle.net/s3grkqxm/
Спасибо вам за вашу помощь.
var numRows = 2, ti = 5;
function isNumber(n) {
return !isNaN(parseFloat(n)) amp;amp; isFinite(n);
}
function recalc() {
var berat = 0;
var qty = 0;
var grandtotal = 0;
var grandtotalbtg = 0;
$('#kas_table').find('tr').each(function() {
var berat = $(this).find('input.berat').val();
var qty = $(this).find('input.qty').val();
var subtotal = (berat * qty);
let berat_max = $(this).find('option:selected').data('berat');
$(this).find('input.subtotal').val(Math.round(subtotal * 100) / 100);
$(this).find('input.berat').val(berat_max).text();
});
}
$(function() {
$('div.table-responsive').on("keyup change blur", recalc);
});
var i=0;
$('#add_new').click(function(){
i ;
$('#mainbody').append('<tr><td>'
'<select class="form-control nama" name="addmore[' i '][nama]" id="nama' i '" required >'
'<option disabled="disabled" selected="selected" value="" >Select Produk</option>'
'<option value="1" data-berat="100">Item 1</option>'
'<option value="1" data-berat="170">Item 2</option>'
'</select></td>'
'<td><input class="form-control qty" type="number" name="addmore[' i '][qty]" id="qty' i '" required ></td>'
'<td><input step=".001" class="form-control berat" type="number" name="addmore[' i '][berat]" id="berat' i '" required ></td>'
'<td><input class="form-control subtotal" type="number" name="addmore[' i '][subtotal]" id="subtotal' i '" required readonly></td>'
)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="table-responsive">
<table class="table-bordered" width="100%" id="kas_table">
<thead>
<tr>
<th width="40%">Name</th>
<th width="10%">Qty</th>
<th width="10%">Weight</th>
<th>Subtotal KG</th>
<th>
<button id="add_new" type="button" name="add_new" class="btn btn-sm btn-success"> </button>
</th>
</tr>
</thead>
<tbody id="mainbody">
<tr>
<td><select class="form-control nama" name="addmore[0][nama]" id="nama0" required >
<option disabled="disabled" selected="selected" value="" >Select Produk</option>
<option value="1" data-berat="100">Item 1</option>
<option value="2" data-berat="170">Item 2</option>
</select></td>
<td><input class="form-control qty" type="number" name="addmore[0][qty]" id=qty0 required></td>
<td><input step=".001" class="form-control berat" type="number" name="addmore[0][berat]" id="berat0" required></td>
<td><input class="form-control subtotal" type="number" name="addmore[0][subtotal]" id="subtotal0" readonly></td>
</tr>
</tbody>
</table>
</div>
Комментарии:
1. Ваш jsFiddle немедленно вылетает с
Uncaught ReferenceError: getdate is not defined
(я видел, что вы отредактировали свой вопрос выше, чтобы эта ошибка исчезла)2. Также, пожалуйста, обновите фрагмент с фактическим примером вместо
'@foreach($produk as $pro)' '<option value="{{$pro->id}}" data-berat="{{ $pro->berat_maksimal }}">{{$pro->nama}}</option>' '@endforeach'
3. извините, забыл отредактировать эту часть
4. Так в чем же сейчас проблема? Похоже, сейчас это нормально работает здесь, во фрагменте … или что именно должно быть не так?
5. Я хочу иметь возможность изменять входное значение, видите ли, когда вы его меняете, оно возвращается к исходному значению, я не могу изменить значение с тем, которое я хочу. Или, может быть, есть другой подход к этому ?
Ответ №1:
причина, по которой при изменении веса он возвращается к исходному значению, заключается в том, что вы обновляете всю таблицу, включая раскрывающийся список, поэтому он возвращает значение, которое должно быть установлено после изменения раскрывающегося списка. $('div.table-responsive').on("keyup change blur", recalc);
из-за этого.
вам просто нужно отделить каждое событие изменения элемента, чтобы получить правильные результаты. Я установил значение в весе в раскрывающемся списке изменение, добавив это
$(document).on('change', 'select', function() {
$('#kas_table').find('tr').each(function() {
let berat_max = $(this).find('option:selected').data('berat');
$(this).find('input.berat').val(berat_max).text();
});
});
и отдельно назовите количество и вес, используя это
$('.qty').on("keyup change blur", recalc);
$('.berat').on("keyup change blur", recalc);
наконец, вот ваш обновленный код, работающий так, как ожидалось, надеюсь, он будет вам полезен.
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
var numRows = 2, ti = 5;
function isNumber(n) {
return !isNaN(parseFloat(n)) amp;amp; isFinite(n);
}
function recalc() {
var berat = 0;
var qty = 0;
var grandtotal = 0;
var grandtotalbtg = 0;
$('#kas_table').find('tr').each(function() {
var berat = $(this).find('input.berat').val();
var qty = $(this).find('input.qty').val();
var subtotal = (berat * qty);
$(this).find('input.subtotal').val(Math.round(subtotal * 100) / 100);
});
}
function selectProduct(e)
{
let berat_max = $(e).find('option:selected').data('berat');
$(e).parent().parent().find('input.berat').val(berat_max).text();
var berat = $(e).parent().parent().find('input.berat').val();
var qty = $(e).parent().parent().find('input.qty').val();
var subtotal = (berat * qty);
$(e).parent().parent().find('input.subtotal').val(Math.round(subtotal * 100) / 100);
}
$(function() {
$(document).on('change', 'select', function() {
$('.qty').on("keyup change blur", recalc);
$('.berat').on("keyup change blur", recalc);
});
var i=0;
$('#add_new').click(function(){
i ;
$('#mainbody').append('<tr><td>'
'<select class="form-control nama" name="addmore[' i '][nama]" id="nama' i '" onchange="selectProduct(this)" required >'
'<option disabled="disabled" selected="selected" value="">Select Produk</option>'
'<option value="1" data-berat="100">Item 1</option>'
'<option value="1" data-berat="170">Item 2</option>'
'</select></td>'
'<td><input class="form-control qty" type="number" name="addmore[' i '][qty]" id="qty' i '" required ></td>'
'<td><input step=".001" class="form-control berat" type="number" name="addmore[' i '][berat]" id="berat' i '" required ></td>'
'<td><input class="form-control subtotal" type="number" name="addmore[' i '][subtotal]" id="subtotal' i '" required readonly></td>'
)
});
});
</script>
</head>
<body>
<div class="table-responsive">
<table class="table-bordered" width="100%" id="kas_table">
<thead>
<tr>
<th width="40%">Name</th>
<th width="10%">Qty</th>
<th width="10%">Weight</th>
<th>Subtotal KG</th>
<th>
<button id="add_new" type="button" name="add_new" class="btn btn-sm btn-success"> </button>
</th>
</tr>
</thead>
<tbody id="mainbody">
<tr>
<td><select class="form-control nama" name="addmore[0][nama]" id="nama0" onchange="selectProduct(this)" required >
<option disabled="disabled" selected="selected" value="">Select Produk</option>
<option value="1" data-berat="100">Item 1</option>
<option value="2" data-berat="170">Item 2</option>
</select></td>
<td><input class="form-control qty" type="number" name="addmore[0][qty]" id=qty0 required></td>
<td><input step=".001" class="form-control berat" type="number" name="addmore[0][berat]" id="berat0" required></td>
<td><input class="form-control subtotal" type="number" name="addmore[0][subtotal]" id="subtotal0" readonly></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
Комментарии:
1. Спасибо, но все равно некоторые не сработали, когда вы меняете вес в первой строке, а затем добавляете новую строку, выбираете элемент, значение строки 1 возвращается к исходному значению.
2. @MulyonoT Я обновил код, пожалуйста, проверьте, теперь он работает так, как ожидалось.
3. Спасибо вам за ваше решение, оно работает безупречно 🙂