Как увеличить значение ячейки в таблице на 1 с помощью JavaScript?

Разрабатываю систему продаж. Используя 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>

Есть ли какие-либо ошибки в вашей консоли разработчика? В чем ваш код работает не так, как ожидалось?

mykaf 11.07.2024 21:02

Этот вопрос похож на: Увеличение значения поля ввода с помощью jQuery. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Heretic Monkey 11.07.2024 21:25

@HereticMonkey Это не то же самое. Чего я хочу добиться, так это остановить дублирование элементов в строках. Таким образом, если товар уже существует в какой-либо строке, значение ячейки количества строки увеличится на единицу. Тем самым прекращая дублирование

GoodNews Carrier 11.07.2024 23:26

Пожалуйста, измените вызов ajax с помощью тестового объекта.

mplungjan 11.07.2024 23:32

@mplungjan готово, проверьте пожалуйста

GoodNews Carrier 11.07.2024 23:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете использовать ++ с вызовом функции, его можно применять только к переменной или выражению, которое ссылается на свойство объекта. Так что измени

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>

это не работает

GoodNews Carrier 11.07.2024 23:27

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

Barmar 11.07.2024 23:30

Где вы инициализируете значение .qty, чтобы это было число, которое можно увеличивать?

Barmar 12.07.2024 00:00

я отредактировал макет

GoodNews Carrier 12.07.2024 00:12

Я не понимаю, что вы делаете в цикле for. Ни в одном из столбцов таблицы нет внутреннего текста, который соответствовал бы if (cols[c].innerText == stock). В таблице всего <input> ящиков.

Barmar 12.07.2024 00:13

Таким образом, это условие никогда не бывает истинным и никогда ничего не увеличивает.

Barmar 12.07.2024 00:17
Ответ принят как подходящий

Чтобы гарантировать, что дубликаты одного и того же элемента не добавляются в разные строки, а вместо этого увеличивается количество существующей строки, нам нужно изменить код, чтобы проверять, существует ли элемент в таблице, прежде чем добавлять новую строку. Если товар существует, мы просто увеличиваем количество существующей строки.

$(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>

Я ценю, что это работает, я видел свои логические ошибки

GoodNews Carrier 12.07.2024 08:10

Другие вопросы по теме