I have a jQuery percentage calculator which is working using .closest('td')
. I need to show the result in the previous table cell <td>
.
$(document).on("change keyup blur live", "input", ".change-calculator", e => {
let $td = $(e.currentTarget).closest('td');
let from = Number($td.find('.calc-from').val());
let to = Number($td.find('.calc-to').val());
let result = ((to - from) / from) * 100;
$td.next().find('.calc-result').text(result.toFixed(2));
$td.next().find('.calc-result').val(result.toFixed(2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="abcde-table" style="width:100%">
<thead>
<tr>
<th>Result</th>
<th>Calculator</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="text" >
</td>
<td>
<input type="text" value="1500"><br>
<input type="text" value="">
</td>
</tr>
</tbody>
</table>
CodePudding user response:
There's three issues in your code. Firstly the event delegated signature of on()
needs three arguments, not four. Remove the first one, as the input
event is all you need.
Secondly, the .calc-result
input is in the td
previous to the current one so use prev()
, not next()
.
Lastly, the input
only has a value, so remove the line setting its text()
.
$(document).on("input", ".change-calculator", e => {
let $td = $(e.currentTarget).closest('td');
let from = Number($td.find('.calc-from').val());
let to = Number($td.find('.calc-to').val());
let result = ((to - from) / from) * 100;
$td.prev().find('.calc-result').val(result.toFixed(2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<table id="abcde-table" style="width:100%">
<thead>
<tr>
<th>Result</th>
<th>Calculator</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="text" readonly />
</td>
<td>
<input type="text" value="1500" /><br />
<input type="text" value="" />
</td>
</tr>
</tbody>
</table>