Разрабатываю систему продаж. Используя Javascript, приведенный ниже код может добавить строку в мою таблицу покупок. Однако с помощью кнопки я могу добавить дубликаты товаров в таблицу покупок. Поэтому я рассматриваю ситуацию, когда вместо дублирования одного и того же элемента в строках запрос на вставку не будет выполнен. Вместо этого количество существующей строки увеличится на одну. Таким образом, если я сканирую две части одного и того же предмета, у меня будет только одна строка со значением 20 в ячейке количества.
Например, если я выберу «Результат 1» дважды, результат 1 должен быть вставлен не в две разные строки, а в одну строку с количеством, равным 2.
Вы можете продемонстрировать код без моей страницы Ajax.
$(document).ready(function() {
$(document).on('click', '.btnaddstockTransfer', function() {
var html = '';
html += '<tr>';
html += '<td><div class = "search-box"><input id = "stock" class = "form-control is-warning stock" type = "text" name = "stock[]" placeholder = "Search by name or code"><div class = "result"></div></div></td>';
html += '<td><input class = "form-control qty" type = "text" name = "qty[]" required size = "2"></td>';
html += '</tr>';
$('#stockTransfer').append(html);
// Live Search
$(document).on('keyup input', '.search-box input[type = "text"]', function() {
/* Get input value on change */
var inputVal = $(this).val();
var resultDropdown = $(this).siblings(".result");
if (inputVal.length) {
//just dummy data for example purposes:
resultDropdown.html("<p>Result 1</p><p>Result 2</p>");
/*$.get("backend-search.php", {
term: inputVal
}).done(function(data) {
// Display the returned data in browser
resultDropdown.html(data);
});*/
} else {
resultDropdown.empty();
}
});
// Set search input value on click of result item
$(document).on("click", ".result p", function() {
var stock = $(this).text();
$(this).parents(".search-box").find('.stock').val(stock);
var tr = $(this).parent().parent().parent().parent();
$(this).parent(".result").empty();
tr.find(".qty").val(1);
table = document.getElementById("stockTransfer");
var rows = table.rows;
for (var i = 1; i < rows.length; i++) {
var cols = rows[i].cells;
for (var c = 0; c < cols.length; c++) {
if (cols[c].innerText == stock) {
//return cols[0].innerHTML;
tr.find(".qty").val() ++;
}
}
}
})
});
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<button class = "btnaddstockTransfer" type = "button">
Add stock transfer
</button>
<div style = "overflow-x:auto">
<table id = "stockTransfer" class = "table">
<thead>
<tr>
<th style = "color:blue">Search Product's(Name/Code)</th>
<th style = "color:blue">Quantity</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>Этот вопрос похож на: Увеличение значения поля ввода с помощью jQuery. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
@HereticMonkey Это не то же самое. Чего я хочу добиться, так это остановить дублирование элементов в строках. Таким образом, если товар уже существует в какой-либо строке, значение ячейки количества строки увеличится на единицу. Тем самым прекращая дублирование
Пожалуйста, измените вызов ajax с помощью тестового объекта.
@mplungjan готово, проверьте пожалуйста



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не можете использовать ++ с вызовом функции, его можно применять только к переменной или выражению, которое ссылается на свойство объекта. Так что измени
tr.find(".qty").val() ++;
к
tr.find(".qty")[0].value++;
Индексирование объекта jQuery возвращает соответствующий элемент DOM. Это позволяет вам напрямую ссылаться на его свойство value, а не вызывать функцию.
Кроме того, при создании поля ввода вам необходимо задать ему начальное значение, чтобы вы могли его увеличить. Поставьте value = "0" в HTML.
$(document).ready(function() {
$(document).on('click', '.btnaddstockTransfer', function() {
var html = '';
html += '<tr>';
html += '<td><div class = "search-box"><input id = "stock" class = "form-control is-warning stock" type = "text" name = "stock[]" placeholder = "Search by name or code"><div class = "result"></div></div></td>';
html += '<td><input class = "form-control qty" type = "text" name = "qty[]" required size = "2" value = "0"></td>';
html += '</tr>';
$('#stockTransfer').append(html);
// Live Search
$(document).on('keyup input', '.search-box input[type = "text"]', function() {
/* Get input value on change */
var inputVal = $(this).val();
var resultDropdown = $(this).siblings(".result");
if (inputVal.length) {
//just dummy data for example purposes:
resultDropdown.html("<p>Result 1</p><p>Result 2</p>");
/*$.get("backend-search.php", {
term: inputVal
}).done(function(data) {
// Display the returned data in browser
resultDropdown.html(data);
});*/
} else {
resultDropdown.empty();
}
});
// Set search input value on click of result item
$(document).on("click", ".result p", function() {
var stock = $(this).text();
console.info(stock);
$(this).parents(".search-box").find('.stock').val(stock);
var tr = $(this).closest("tr");
$(this).parent(".result").empty();
table = document.getElementById("stockTransfer");
var rows = table.rows;
for (var i = 1; i < rows.length; i++) {
console.info(`row ${i}`);
var cols = rows[i].cells;
for (var c = 0; c < cols.length; c++) {
console.info(`col ${c}, ${cols[c].innerText}`);
if (cols[c].innerText == stock) {
//return cols[0].innerHTML;
tr.find(".qty")[0].value++;
}
}
}
})
});
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<button class = "btnaddstockTransfer" type = "button">
Add stock transfer
</button>
<div style = "overflow-x:auto">
<table id = "stockTransfer" class = "table">
<thead>
<tr>
<th style = "color:blue">Search Product's(Name/Code)</th>
<th style = "color:blue">Quantity</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>это не работает
Можете ли вы предоставить рабочий минимально воспроизводимый пример? Я не могу протестировать ваш код, поскольку для функции поиска он использует AJAX. Можете ли вы заменить это макетным кодом, который работает локально?
Где вы инициализируете значение .qty, чтобы это было число, которое можно увеличивать?
я отредактировал макет
Я не понимаю, что вы делаете в цикле for. Ни в одном из столбцов таблицы нет внутреннего текста, который соответствовал бы if (cols[c].innerText == stock). В таблице всего <input> ящиков.
Таким образом, это условие никогда не бывает истинным и никогда ничего не увеличивает.
Чтобы гарантировать, что дубликаты одного и того же элемента не добавляются в разные строки, а вместо этого увеличивается количество существующей строки, нам нужно изменить код, чтобы проверять, существует ли элемент в таблице, прежде чем добавлять новую строку. Если товар существует, мы просто увеличиваем количество существующей строки.
$(document).ready(function() {
$(document).on('click', '.btnaddstockTransfer', function() {
var html = '';
html += '<tr>';
html += '<td><div class = "search-box"><input id = "stock" class = "form-control is-warning stock" type = "text" name = "stock[]" placeholder = "Search by name or code"><div class = "result"></div></div></td>';
html += '<td><input class = "form-control qty" type = "text" name = "qty[]" required size = "2" value = "1"></td>';
html += '</tr>';
$('#stockTransfer tbody').append(html);
// Live Search
$(document).on('keyup input', '.search-box input[type = "text"]', function() {
/* Get input value on change */
var inputVal = $(this).val();
var resultDropdown = $(this).siblings(".result");
if (inputVal.length) {
//just dummy data for example purposes:
resultDropdown.html("<p>Result 1</p><p>Result 2</p>");
/*$.get("backend-search.php", {
term: inputVal
}).done(function(data) {
// Display the returned data in browser
resultDropdown.html(data);
});*/
} else {
resultDropdown.empty();
}
});
// Set search input value on click of result item
$(document).on("click", ".result p", function() {
var stock = $(this).text();
var tr = $(this).closest('tr');
var qtyInput = tr.find('.qty');
// Check if the stock item already exists in the table
var exists = false;
$('#stockTransfer tbody tr').each(function() {
var currentRowStock = $(this).find('.stock').val();
if (currentRowStock === stock) {
exists = true;
var currentQty = $(this).find('.qty').val();
$(this).find('.qty').val(parseInt(currentQty) + 1);
}
});
if (!exists) {
$(this).parents(".search-box").find('.stock').val(stock);
qtyInput.val(1); // Set default quantity to 1
} else {
tr.remove(); // Remove the newly added empty row if item already exists
}
$(this).parent(".result").empty();
});
});
});
</script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<button class = "btnaddstockTransfer" type = "button">
Add stock transfer
</button>
<div style = "overflow-x:auto">
<table id = "stockTransfer" class = "table">
<thead>
<tr>
<th style = "color:blue">Search Product's(Name/Code)</th>
<th style = "color:blue">Quantity</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>
</div>
Я ценю, что это работает, я видел свои логические ошибки
Есть ли какие-либо ошибки в вашей консоли разработчика? В чем ваш код работает не так, как ожидалось?