Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Динамический подсчёт динамически созданных полей input (https://javascript.ru/forum/jquery/71680-dinamicheskijj-podschjot-dinamicheski-sozdannykh-polejj-input.html)

Taichi 05.12.2017 10:37

Динамический подсчёт динамически созданных полей input
 
Вложений: 1
Доброго времени суток, форумчане.

Подскажите решение проблемы.

Есть скрипт для добавления полей в форме и нужен их подсчёт по событию onBlur.

.append (
		$('<td>')
		.attr('id','td2_'+total)
		.css({width:'10%'})
		.append(
			$('<input type="number" />')
			.css({width:'95%'})
			.attr('id','kil_'+total)
			.attr('name','kile_'+total)	
		)	
        .append (
		$('<td>')
		.attr('id','td_'+total)
		.css({width:'10%'})
		.append(
			$('<input type="number" />')
			.css({width:'95%'})
			.attr('id','cena_'+total)
			.attr('name','cena_'+total)	
                        .attr('class','suma')	
                        .attr('onBlur','sum();')				
		)


Надо Шт. умножить на Цену для каждой строки а потом результат сложить. У меня выходит сделать любые вычисления только с первой строкой, которая грузится вместе со страницей, все что добавляется "в будущем" подсчёту не поддаётся :-?

Ткните носом пожалуйста, я в программировании очень слаб.

laimas 05.12.2017 15:16

Taichi,
проще иметь одну строку таблицы с полями, которую нельзя удалить (обязательная по умолчанию), и которую клонировать, и добавлять в таблицу.

Далее не понятно, почему именно onblur, а не например при изменениях в полях формы?

Taichi 05.12.2017 18:12

Я и говорю что в программировании не селен, можно и на любой событие которое точно произойдет незаметно для пользователя.

Если клонировать строки, то после отправки формы они сольются в одну переменную $_POST ?

Мне нужна уникальность каждой введенной переменой.

laimas 05.12.2017 18:30

Цитата:

Сообщение от Taichi
Если клонировать строки, то после отправки формы они сольются в одну переменную $_POST ?

Не знаю что подразумевается под "сольются" да и $_POST, это не переменная, а суперглобальный массив.

Цитата:

Сообщение от Taichi
Мне нужна уникальность каждой введенной переменой.

А что значит уникальность? Если у вас одна строка таблицы имеет к примеру два поля формы с именами abc и def, и они таковыми будут дублироваться, то в $_POST вы получите значение только последних полей. Но если эти имена определить как элементы массива - abc[] и def[], то $_POST будет содержать два индексных массива дынных, а индексы такая же уникальность как А и Б. Можно именовать поля и так, что в результате $_POST буде содержать один многомерный массив, вложения которого это поля abc и def соответственно под индексами 0 и 1, а можно и ассоциативное вложение, то есть в $_POST будет - [[abc=>значение, def=>значение], [abc=>значение, def=>значение], ...].

Какой структуры данные нужны серверу для обработки определяет он (серверный обработчик), из этого определения и будут определяться именование полей на клиенте. Так что определитесь с этим, дальнейшее будет от этого и зависеть. Только сразу предупреждаю - именование полей как name1 и подобное, это очень плохо.

Taichi 05.12.2017 19:07

Хорошо, я вас понял, и далеко не претендую на правоту.

Но, как правильно использовать .clone() для input?
И как их значения сложить?

Я очень, очень туго разбираюсь в синтаксисе JQuery.

Пожалуйста, начертайте пример на 2х input в одной строке.

laimas 05.12.2017 19:38

<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<style>
table tbody:first-child td:last-child input {
    display: none; /* кнопка удаления в первой строке таблицы недоступна*/
}
</style>
<script type="text/javascript">
$(function() {
    var tbl = $('table');
    $('#add').click(function() {
        tbl.children() //получаем детишек - TR/TBODY
           .first() //берем первого
           .clone() //клонируем
           .appendTo(tbl) //добавляем в таблицу 
           .find('input') //получаем поля ввода
           .filter(':text').val('') //выбираем текстовые поля (если кнопка удаления не input, то этого не надо)
           .end() //в начало набора
           .last().click(function() { //получаем кнопку удаления (если кнопка удаления не input, то ищем нужно вместо last())
                $(this).closest('tr').remove() //удаляем добавленную строку 
           })
    })
});
</script>
</head>
<body>
<form action="" method="post">
    <table>
        <tr>
            <td>
                <input name="a[]" />
            </td>
            <td>
                <input name="b[]" />
            </td>
            <td>
                <input name="c[]" />
            </td>
            <td>
                <input type="button" value="Del" />
            </td>
        </tr>
    </table>
</form>
<button id="add">Add</button>
</body>
</html>


При отправлении формы в массиве $_POST будет три массива a, b, c соответственно. Так удобно, ибо, например, для того чтобы проверить и получить только те поля которые заполнены, достаточно произвести пересечение этих массивов по ключам (индексам). А для формирования многострочного запроса в базу (для записи), достаточно пересечь результат пересечения с каждым набором и объединить их по полям - array_map(null, $_POST['a'], $_POST['b'], $_POST['c']).

Taichi 05.12.2017 19:46

Красивый код, моё почтение.
Но этот же функционал я слепил сам без клонирования, мне подсчет динамический важен.
a[0]*b[0]=x[0]
a[1]*b[1]=x[1]
и тд..

sum = x[0]+x[1]+....+x[n]

Вот этого я не могу решить =(

laimas 05.12.2017 19:58

Цитата:

Сообщение от Taichi
Но этот же функционал я слепил сам без клонирования

Вот именно, что вы лепите, а проще клонировать, а не писать портянки.

Расчет же можно производить по событию ввода в поля, делегировав эту обработку тегу form, то есть добавить еще обработчик в $(function() { });

$('form').on('input', 'input', function() {
    //здесь обходом в цикле полей формы получать их значения и производить расчет согласно условиям
})

Taichi 05.12.2017 20:14

Вот вы сыплете терминологией из вашей области познаний.
Но я же написал, что НЕ знаю js, jquery и языков программирования.

Вы меня исправили, что я не правильно сделал функционал добавления полей, я принял ваше решение, ссылаясь на подпись профессор под ником на форуме. Вы здесь гуру, вам виднее.

Проведу вам аналогию: Вы едете на своем самодельном транспорте в автосалон, покупать новое авто. Но вам продавец говорит: что это у вас за транспортное средство такое, неправильное, зачем вы его вообще слепили?
- Вот вам хороший набор колес, арок, дисков, шин, поршней, стекол, фар, проводки и вооон там в углу возьмите гаечный ключ и напильник, и скрутите себе Нормальное! авто.

laimas 05.12.2017 20:24

Цитата:

Сообщение от Taichi
Вот вы сыплете терминологией из вашей области познаний.
Но я же написал, что НЕ знаю js, jquery и языков программирования.

Так а я откуда знаю что и как считать, мне тоже a[0]*b[0]=x[0] ни о чем не говорят, или если я знаю термины, то должен и догадаться?

Не надо аналогий, нужна помощь значит пишите конкретно - у вас 6 полей, значит так и пишите, к примеру, поле 1 умножить на поле 3 и поместить в поле 5, и т.п. Только учтите, если результат помещается также в поле формы для отправки серверу, то это дохлый номер, серверу эти расчеты не нужны, это чистый сервис для клиента.

рони 05.12.2017 20:40

общая сумма строк
 
Taichi,
вставить количество и цену
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<style>
table tbody:first-child td:last-child input {
    display: none; /* кнопка удаления в первой строке таблицы недоступна*/
}
.total {
  margin-left: 400px;
}

</style>
<script type="text/javascript">
$(function() {
    var tbl = $('table');
    $('#add').click(function() {
        tbl.children() //получаем детишек - TR/TBODY
           .first() //берем первого
           .clone() //клонируем
           .appendTo(tbl) //добавляем в таблицу
           .find('input') //получаем поля ввода
           .filter(':text').val('') //выбираем текстовые поля (если кнопка удаления не input, то этого не надо)
           .end() //в начало набора
           .last().click(function() { //получаем кнопку удаления (если кнопка удаления не input, то ищем нужно вместо last())
                $(this).closest('tr').remove() //удаляем добавленную строку
                sum();
           })
    });
function sum()
{
     var a = document.querySelectorAll('input[name="a[]"]'),
      b = document.querySelectorAll('input[name="b[]"]'),
      c = document.querySelectorAll('input[name="c[]"]'),
      t = document.querySelector('.total');
      t.innerHTML = [].reduce.call( a , function(s, el, i) {
       c[i].value = (+el.value||0) * (+b[i].value||0);
       return  s + +c[i].value
},0).toFixed(2) + " руб.";
}

$('form').on('input', 'input[name="a[]"], input[name="b[]"]', sum)





});
</script>
</head>
<body>
<form action="" method="post">
    <table>
        <tr>
            <td>
                <input name="a[]" />
            </td>
            <td>
                <input name="b[]" />
            </td>
            <td>
                <input name="c[]"  disabled="disabled"/>
            </td>
            <td>
                <input type="button" value="Del" />
            </td>
        </tr>
    </table>
    <span class="total"></span>
</form>
<button id="add">Add</button>
</body>
</html>

Taichi 05.12.2017 20:51

Спасибо, большое спасибо. Все в точку, как надо.:thanks:

Taichi 09.12.2017 21:24

И снова проблема у меня.
Загнал я эти инпуты в базу данных.
Вытянул данные, расставил в те же инпуты, что бы можно было динамически редактировать (удалять уже записанную строку, добавить новою, и снова это все динамически подсчитать)

Меня очень напрягает синтаксис java.

Подскажите, как реализовать?

<script type="text/javascript">
        		$(function() {
		  //добавить строку табюлицы
		  $('#but').on('click', function() {
		    var row = $('.row:last');
		    row.clone().insertAfter(row);
		  });

		  //удалить строку таблицы
		  $('#tab').on('click', '.delete', removeRow);

		  function removeRow() {
		    $(this).closest('.row').remove();
		  }
		})

function sum()
{
     var a = document.querySelectorAll('input[name="a[]"]'),
      b = document.querySelectorAll('input[name="b[]"]'),
      c = document.querySelectorAll('input[name="c[]"]'),
      t = document.querySelector('.total');
	   alert( 'Привет, Мир!' );
      t.innerHTML = [].reduce.call( a , function(s, el, i) {
       c[i].value = (+el.value||0) * (+b[i].value||0);
       return  s + +c[i].value
},0).toFixed(2) + " грн";
}

$('form').on('input', 'input[name="a[]"], input[name="b[]"]', sum)



    </script>


а вот php i html
echo "<tr  class='row'>
<td width='16%'><input type='text' name='art[]'  style='width:100%' value=".$art[$x]."></td>
<td width='16%'><input type='text' name='name[]' style='width:100%'  value=".$name[$x]."></td>
<td width='8%'><input type='number' min='1' name='a[]' style='width:100%' value=".$a[$x]."></td>
<td width='16%'><input type='text' name='dealer[]'  style='width:100%' value=".$dealer[$x]."></td>
<td width='8%'><input type='number' min='0' name='zakup[]'  style='width:100%' value=".$zakup[$x]."></td>
<td width='8%'><input type='number' min='0' name='b[]' style='width:100%' value=".$b[$x]."></td>
<td width='8%'><input type='text' name='с[]' style='width:100%' disabled='disabled' ></td>
<td width='2%'><input type='checkbox' name='stage1[]' style='width:100%' value=".$stage1[$x]."></td>
<td width='2%'><input type='checkbox' name='stage2[]' style='width:100%' value=".$stage2[$x]."></td>
<td width='2%'><input type='checkbox' name='stage3[]' style='width:100%'  value=".$stage3[$x]."></td>
<td width='2%'><a href='#'><input class='delete' type='button' value='x' /> </a></td>
</tr>";}

 
 
 
  ?>

</table>
<table  id="tab" width="100%" >
<tr  class='row'> 
<td width='16%'><input type='text' name='art[]'  style='width:100%'></td>
<td width='16%'><input type='text' name='name[]' style='width:100%' ></td>
<td width='8%'><input type='number' min='1' name='a[]' style='width:100%' ></td>
<td width='16%'><input type='text' name='dealer[]'  style='width:100%'></td>
<td width='8%'><input type='number' min='0'  name='zakup[]'  style='width:100%' ></td>
<td width='8%'><input type='number' min='0' name='b[]' style='width:100%' ></td>
<td width='8%'><input type='text' name='c[]'  style='width:100%'  disabled='disabled' ></td>
<td width='2%'><input type='checkbox' name='stage1[]' style='width:100%'></td>
<td width='2%'><input type='checkbox' name='stage2[]' style='width:100%' ></td>
<td width='2%'><input type='checkbox' name='stage3[]' style='width:100%' ></td>
<td width='2%'> <input type="button" class='delete' value="x" /> </td>
</tr></table>
 
		<input type="button" value="Добавить еще поля" id="but" >
	<input type="submit" value="Редактировать заказ">
	
			</form>
			<span style="margin-left:600px" class="total">Вся сумма заказа грн.</span>


Часовой пояс GMT +3, время: 09:40.