#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть php-скрипт, который выводит значения цен для текущей страницы в таблице. Каждая строка представляет собой разную цену за 1 товар и может быть отредактирована.
<table border="0" cellpadding="5" cellspacing="0" class="content" id="page_prices">
<thead>
<tr>
<th>description</th>
<th>sku</th>
<th>single</th>
<th>quantity</th>
<th>price</th>
<th>currency</th>
<th width="25"></th>
</thead>
<tbody>
<?php
for($i=0; $i<$count_prices; $i )
{
echo "<tr>";
echo "<td><input name="price_description[]" type="text" id="price_description" size="20" value="".$prices[$i]['description']."">";
echo "<td><input name="price_code[]" type="text" id="price_code" size="5" value="".$prices[$i]['code']."">";
echo "<td><input name="price_pcs[]" type="text" id="price_pcs" size="5" value="".$prices[$i]['pcs']."">";
echo "<td><input name="price_qty[]" type="text" id="price_qty" size="5" value="".$prices[$i]['qty']."">";
echo "<td><input name="price_value[]" type="text" id="price_value" size="10" maxlength="10" value="".$prices[$i]['price_value']."" onChange = "CalcSale(this.form, $i);">";
echo "<td><input name="otstupka_pr[]" type="text" id="otstupka_pr" size="5" value="0" onChange = "CalcPerc(this.form, $i);">";
echo "<td><input name="regular_price[]" type="text" id="regular_price" size="5" value="".$prices[$i]['real_price']."" onChange = "CalcSale(this.form, $i);">";
echo "<td><input name="valid_to[]" type="date" id="valid_to" size="10" maxlength="10" value="".$prices[$i]['valid_to']."">";
echo "<td>";
echo "</tr>";
}
?>
</tbody>
<tfoot>
<tr><td colspan="7"> <a href="javascript: void(0)" id="add_page_price" class="add">Add price</a>
</tfoot>
</table>
Есть 2 функции, которые вычисляют на основе пользовательского ввода: CalcSale
и CalcPerc
. Каждый из них использует значение ввода и счетчика $i
для вычисления отдельно для каждой строки. Когда пользователь решает добавить новую цену и нажимает на add_page_price
последнюю строку, клонируется с:
$j("#add_page_price").click(function(){
$j("#page_prices tbody tr:last").clone().appendTo("#page_prices tbody");
})
Вопрос в том, как я могу клонировать последнюю строку и увеличивать аргумент $i
в onChange = "CalcSale(this.form, $i);"
Комментарии:
1. Ваш HTML неверен. Вы не можете использовать одно и то же
id
для более чем одного элемента в DOM. Если вы хотите идентифицировать несколько элементов, используйте класс илиdata-*
атрибут.2. Кроме того, в вашем PHP вы можете использовать
'
для разграничения строки, чтобы вы могли использовать"
ее внутри, не используя escape-символ.
Ответ №1:
Как я могу клонировать последнюю строку и увеличивать аргумент
$i
вonChange = "CalcSale(this.form, $i);"
Я бы вообще этого не делал. Я бы предложил использовать современную обработку событий, возможно, с делегированием событий:
1. Не выводите onChange
атрибут для input
элементов, но включайте в них либо классы, либо data-*
атрибуты (возможно price-value
, и regular-price
классы).
2. Измените CalcSale
функцию, чтобы она принимала событие DOM.
function CalcSale(event) { // <== Consider using standard JavaScript convention: `calcSale`
const row = $j(event.target).closest("tr");
const priceValue = row.find(".price-value");
const regularPrice = row.find(".regular-price");
// ...use `priceValue` and `regularPrice` jQuery objects
}
3. Подключитесь CalcSale
следующим образом:
$j("#page_prices").on("change", ".price-value, .regular-price", CalcSale);
(Подумайте также о добавлении input
события: .on("change input"
…)
Тогда вашему коду клонирования не нужно беспокоиться об увеличении счетчика (а также проще удалять строки), и ваш существующий код работает:
// (Not changed)
$j("#add_page_price").click(function(){
$j("#page_prices tbody tr:last").clone().appendTo("#page_prices tbody");
})