У меня есть код HTML:
<table>
<th>Items</th><th>Rate</th><th>Quantity</th>
<tr><td>Item A</td><td>20</td><td><input type="text" id="txtItemA"/></td></tr>
<tr><td>Item B</td><td>10</td><td><input type="text" id="txtItemB"/></td></tr>
<tr><td>Item C</td><td>30</td><td><input type="text" id="txtItemC"/></td></tr>
<tr><td>Total Price</td><td><input type="text" id="txtPrice"/></td></tr>
</table>
В событии onblur текстовых полей я хочу вызвать функцию javascript, которая будет умножать количество, добавленное пользователем, на скорость и отображать его в текстовом поле txtPrice. Но я зациклился на логике того, как мне выбрать скорость, соответствующую введенному количеству.
Например: Когда я ввожу 2 в текстовое поле txtItemA, 40 должно отображаться в текстовом поле txtPrice. Функция Javascript проста, она просто умножит ставку с введенным количеством и отобразит его в txtPrice.
Что мне нужно сделать, чтобы получить связанную скорость с количеством и передать ее функции javascript?
Функция Javascript
function DisplayTotal(rate, quantity)
{
document.getElementById('txtPrice').innerText = rate * quantity;
}
jsfiddle: http://jsfiddle.net/FeLKx/4/
HTML:
<table class="items">
<thead>
<th>Items</th>
<th>Rate</th>
<th>Quantity</th>
</thead>
<tbody>
<tr class="item">
<td>Item A</td>
<td class="rate">20</td>
<td class="quantity">
<input type="text" id="txtItemA" />
</td>
</tr>
<tr class="item">
<td>Item B</td>
<td class="rate">10</td>
<td class="quantity">
<input type="text" id="txtItemB" />
</td>
</tr>
<tr class="item">
<td>Item C</td>
<td class="rate">30</td>
<td class="quantity">
<input type="text" id="txtItemC" />
</td>
</tr>
<tr>
<td>Total Price</td>
<td>
<input type="text" id="txtPrice" />
</td>
</tr>
</tbody>
</table>
JS:
$(document).ready(function () {
$('.items .item .quantity input').blur(function () {
var total = 0;
$('.items .item').each(function(index, value) {
var rate = $(this).find('.rate').text();
var quantity = $(this).find('.quantity input').val();
total += rate * quantity;
});
$('#txtPrice').val(total);
});
});
Дайте рассматриваемым элементам общий класс, скажем, class="quantity"
, чтобы их можно было легко выбрать без указания идентификаторов или с помощью слишком общего селектора, который также подбирает общее поле цены, а затем вы можете сделать это:
var $qtyFields = $('input.quantity').change(function() {
var price = 0;
$qtyFields.each(function() {
price += this.value * $(this).closest("tr").find("td:eq(1)").text();
});
$("#txtPrice").val(price);
});
Демо: http://jsfiddle.net/95hje/
То есть, перебирайте каждое поле и умножайте его значение на столбец скорости в той же строке. Поиск связанного элемента с помощью .closest()
для получения общего предка, а затем .find()
для .find()
назад - это общий шаблон.
Обратите внимание, что оператор *
будет принуждать его операнды к числу, но код, который я показал, фактически не делает никакой проверки, поэтому, если пользователь вводит нечисловые данные, общее количество будет NaN
...
Чистое javascript-решение (без JQuery), которое будет работать, даже если вы измените количество строк в таблице и которое будет обрабатывать проблему с неправильным вводом пользователя:
<html>
<head>
<script type="text/javascript">
function DisplayTotal(){
var num = document.getElementById("myTable").rows.length-2;
var tds = document.getElementsByTagName("td"), total = 0, rate, quant;
for(var i = 0; i < num; i++){
rate = parseInt(tds[3*i+1].innerHTML);
quant = parseInt(tds[3*i+2].firstChild.value);
if(isNaN(quant)){
continue;
}
total += rate*quant;
}
document.getElementById("txtPrice").value = total;
}
</script>
</head>
<body>
<table id="myTable">
<tr><th>Items</th><th>Rate</th><th>Quantity</th></tr>
<tr><td>Item A</td><td>20</td><td><input type="text" id="txtItemA" onkeyup="DisplayTotal();"></td></tr>
<tr><td>Item B</td><td>10</td><td><input type="text" id="txtItemB" onkeyup="DisplayTotal();"></td></tr>
<tr><td>Item C</td><td>30</td><td><input type="text" id="txtItemC" onkeyup="DisplayTotal();"></td></tr>
<tr><td>Item D</td><td>50</td><td><input type="text" id="txtItemD" onkeyup="DisplayTotal();"></td></tr>
<tr><td>Total Price</td><td><input type="text" id="txtPrice"></td></tr>
</table>
<button type="button" onclick="DisplayTotal();">Get Total Price</button>
</body>
</html>
Смотрите демо здесь.
Это ваш html
<table>
<th>Items</th><th>Rate</th><th>Quantity</th>
<tr><td>Item A</td><td>20</td><td><input type="text" id="txtItemA"/></td></tr>
<tr><td>Item B</td><td>10</td><td><input type="text" id="txtItemB"/></td></tr>
<tr><td>Item C</td><td>30</td><td><input type="text" id="txtItemC"/></td></tr>
<tr><td>Total Price</td><td><input type="text" id="txtPrice"/></td></tr>
</table>
Это будет ваш скрипт
$(document).ready(function(){
$('table').on('blur','td input[id^=txtItem]',function(){
var fields = $('td input[id^=txtItem]');
var total = 0;
$.each(fields,function(index,value){
var quantity = $(this).val();
var rate = $(this).parent('td').prev('td').text();
total += (quantity * rate);
});
$('#txtPrice').val(total);
});
});
На заметку я настоятельно рекомендую вам не полагаться на javascript, чтобы, наконец, зарядить посетителя, так как это можно легко изменить на 0
с помощью javascript
Измените свою разметку, чтобы добавить некоторые классы к элементам ввода для легкого выбора
<table>
<th>Items</th>
<th>Rate</th>
<th>Quantity</th>
<tr>
<td>Item A</td>
<td>20</td>
<td>
<input type="text" class="txtItem" id="txtItemA" />
</td>
</tr>
<tr>
<td>Item B</td>
<td>10</td>
<td>
<input type="text" class="txtItem" id="txtItemB" />
</td>
</tr>
<tr>
<td>Item C</td>
<td>30</td>
<td>
<input type="text" class="txtItem" id="txtItemC" />
</td>
</tr>
<tr>
<td>Total Price</td>
<td>
<input type="text" id="txtPrice" />
</td>
</tr>
</table>
тогда
jQuery(function () {
var $items = $('.txtItem').change(function () {
var total = 0;
$items.each(function () {
total += ($(this).data('price') * parseInt(this.value)) || 0;
})
$('#txtPrice').val(total)
}).each(function () {
//store the price of the item in data for easy access later
$(this).data('price', parseInt($(this).parent().prev().text(), 10) || 0);
})
})
Демо: скрипка
У меня есть самое простое решение, которое я предполагаю (без jQuery):
<html lang="en">
<head>
<title><!-- Insert your title here --></title>
<script language="javascript" type="text/javascript">
function DisplayTotal()
{
var quantity = 0, rate = 0, total=0;
var i=0;
do {
var c = document.getElementById("txtItem" + i++);
if (c) {
var r = c.parentNode.previousSibling;
if (c.value) {
quantity = parseFloat(c.value);
rate = parseFloat(r.innerHTML);
total += quantity * rate;
}
}
} while(c);
document.getElementById('txtPrice').value = total.toFixed(2);
}
</script>
</head>
<body>
<table>
<th>Items</th><th>Rate</th><th>Quantity</th>
<tr><td>Item A</td><td>20</td><td><input type="text" id="txtItem0" onblur="DisplayTotal()"/></td></tr>
<tr><td>Item B</td><td>10</td><td><input type="text" id="txtItem1" onblur="DisplayTotal()"/></td></tr>
<tr><td>Item C</td><td>30</td><td><input type="text" id="txtItem2" onblur="DisplayTotal()"/></td></tr>
<tr><td>Total Price</td><td><input type="text" id="txtPrice"/></td></tr>
</table>
</body>
См. Демо здесь http://jsfiddle.net/UFS97/1/
<table id="invoice_tbl">
<th>Items</th>
<th>Rate</th>
<th>Quantity</th>
<tr class="item">
<td>Item A</td>
<td>20</td>
<td>
<input type="text" class="item_price" id="txtItemA" value=""/>
</td>
</tr>
<tr class="item">
<td>Item B</td>
<td>10</td>
<td>
<input type="text" class="item_price" id="txtItemB"/>
</td>
</tr>
<tr class="item">
<td>Item C</td>
<td>30</td>
<td>
<input type="text" class="item_price" id="txtItemC" value=""/>
</td>
</tr>
<tr>
<td>Total Price</td>
<td>
<input type="text" id="txtPrice"/>
</td>
</tr>
</table>
jQUery
---------------------------
$(document).ready(function(){
$(".item_price").blur(function(){
total = 0.00;
item_row = $("table#invoice_tbl").children('tbody').children("tr.item");
item_row.each(function(){
item_price = parseFloat($(this).children('td').eq(1).html());
item_qty = parseInt($(this).children('td').eq(2).children('input').val());
row_price = item_price*item_qty;
if(!isNaN(row_price)){
total +=row_price;
}
});
$("#txtPrice").val(total);
});
});
См. Демо здесь http://jsfiddle.net/UFS97/1/