Squeak.ru - шаблоны программирования

Как пройти через оператор if, который делает текстовые поля доступными для ввода?

Я хотел бы зациклить оператор if, который является этой строкой if($(this).hasClass('numInput')) {, потому что расчет нескольких элементов в приведенном ниже коде не работает.

Это должно быть так: При выборе флажка нескольких элементов текстовое поле становится доступным для ввода. Введя числа (например: 2), затем установив флажок ниже (например, проверив 100 и 200), в сумме появится 500 (100 * 2 + 200 * 2).

Одна задача может работать, однако проверка более чем одного элемента вызывает проблемы.

Попытка зациклить оператор if, если он может это сделать, или какую-то другую идею, чтобы исправить ошибку.

var subTotal, total;
$(function() {
  $('input.value, input.pages').off('change');
  $('input.value, input.pages').on('change', function() {
    amountCalc();
  });
});

function amountCalc() {
  total = 0;
  $('.category').each(function() {
    subTotal = 0;
    $(this).find('input[type="checkbox"]:checked, input[type="radio"]:checked').each(function() {
      if ($(this).hasClass('numInput')) {
        var num = parseInt($(this).next().val());
        var itemNest = $(this).closest('.itemNest');
        var array = [];
        $('input[class="value"]:checked', itemNest).each(function() {
          var itemVal = Number($(this).val());
          array.push(itemVal);
        });
        for (var i = 0; i < array.length; i++) {
          subTotal += array[i] * num;
        }
        return false;
      } else {
        subTotal += Number($(this).val());
      }
    });
    $(this).find('.subTotal').val(subTotal);
    total += subTotal;
  });

  $('.total').val(total);
  $('.totalPer130').val(total * 1.3);
  $('.totalPer70').val((total) - (total * 0.3));

}

$(function() {
  $('.category .itemNest').each(function() {
    var itemNest = this;
    //デフォルト children選択不可
    $('input[name="children"]').prop('checked', false).prop('disabled', true);
    $('.category .itemNest').find('.parent').change(function() {
      //parentのチェック判別
      if ($('.parent', itemNest).prop("checked")) {
        $('input[name="children"]', itemNest).prop('disabled', false);
      } else {
        $('input[name="children"]', itemNest).prop('checked', false).prop('disabled', true);
      }
      amountCalc();
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="">
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="checkbox" class="parent numInput">multiple items:
            <input type="text" name="children" value="0" class="pages">pages</label>
          <ul>
            <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
            <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
            <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
        <div class="itemNest">
          <label><input type="checkbox" class="parent numInput">multiple items:
            <input type="text" name="children" value="0" class="pages">pages</label>
          <ul>
            <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
            <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
            <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
      </td>
    </tr>
  </table>
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="checkbox" value="0" class="parent">single item:
            <ul>
              <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
          <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
          <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
      </td>
    </tr>
  </table>
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="radio" value="0" name="parent1" class="parent">single item:</label>
          <ul>
            <li><label><input type="radio" class="value" value="100" name="children">100</label></li>
            <li><label><input type="radio" class="value" value="200" name="children">200</label></li>
            <li><label><input type="radio" class="value" value="300" name="children">300</label></li>
          </ul>
          <label><input type="radio" value="0" name="parent1" class="parent">none</label>
        </div>
      </td>
    </tr>
  </table>

  <table class="output">
    <tr>
      <td><label>Total : <input type="text" class="total" value="0">yen</label></td>
    </tr>
    <tr>
      <td><label>30% extra:<input type="text" class="totalPer130" value="0">yen</label></td>
    </tr>
    <tr>
      <td><label>30% discount:<input type="text" class="totalPer70" value="0">yen</label></td>
    </tr>
    <tr>
      <td><input type="reset" value="リセット"></td>
    </tr>
  </table>
</form>


  • Вам нужен этот return false; посередине? Это эквивалентно break для .each(), т.е. он будет получать только первый ввод с классом .numInput. 04.02.2019
  • Я думаю, что да, в противном случае значение входных именованных дочерних элементов в классе itemNest вычисляется еще один раз. 04.02.2019

Ответы:


1

Честно говоря, я не уверен, что вы подразумеваете под «зацикливанием оператора if», но похоже, что вы ошиблись, когда перебирали все флажки, а затем пытались разобраться, что было внутри цикла; return false предотвратит доступность любого набора, кроме первого. Логике будет намного легче следовать, если вы будете использовать более конкретные селекторы для каждого цикла вместо того, чтобы пытаться выйти с помощью return false.

Ниже приведена прокомментированная переработка вашего кода, который, кажется, работает:

var subTotal, total;
$('input.value, input.pages').on('change', amountCalc);

function amountCalc() {
  var total = 0;
  
  // loop over every checked parent, skip the others
  $('.parent:checked').each(function() {
    var container = $(this).closest('.itemNest');

    // you never display the subTotal anywhere, so you could instead just
    // skip that and add to the total at every step; I left it in just in case
    var subTotal = 0;

    // find the "pages" value, or use 1 if it's a "single item" 
    var multiplier;
    if (container.find('.pages').length > 0) {
      // the || 0 prevents NaN input:
      multiplier = Number(container.find('.pages').val()) || 0
    } else {
      multiplier = 1;
    }

    // sum up the checked values within this container
    container.find('.value:checked').each(function() {
      subTotal += (Number($(this).val()) * multiplier)
    })
    total = total + subTotal;
  })

  $('.total').val(total);
  $('.totalPer130').val(total * 1.3);
  $('.totalPer70').val((total) - (total * 0.3));
}

// below code is unchanged from original

$('.category .itemNest').each(function() {
  var itemNest = this;
  //デフォルト children選択不可
  $('input[name="children"]').prop('checked', false).prop('disabled', true);
  $('.category .itemNest').find('.parent').change(function() {
    //parentのチェック判別
    if ($('.parent', itemNest).prop("checked")) {
      $('input[name="children"]', itemNest).prop('disabled', false);
    } else {
      $('input[name="children"]', itemNest).prop('checked', false).prop('disabled', true);
    }
    amountCalc();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="">
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="checkbox" class="parent numInput">multiple items:</label>
            <input type="text" name="children" value="0" class="pages">pages
          <ul>
            <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
            <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
            <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
        <div class="itemNest">
          <label><input type="checkbox" class="parent numInput">multiple items:</label>
            <input type="text" name="children" value="0" class="pages">pages
          <ul>
            <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
            <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
            <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
      </td>
    </tr>
  </table>
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="checkbox" value="0" class="parent">single item:
            <ul>
              <li><label><input type="checkbox" class="value" value="100" name="children">100</label></li>
          <li><label><input type="checkbox" class="value" value="200" name="children">200</label></li>
          <li><label><input type="checkbox" class="value" value="300" name="children">300</label></li>
          </ul>
        </div>
      </td>
    </tr>
  </table>
  <table class="category">
    <tr>
      <td>
        <div class="itemNest">
          <label><input type="radio" value="0" name="parent1" class="parent">single item:</label>
          <ul>
            <li><label><input type="radio" class="value" value="100" name="children">100</label></li>
            <li><label><input type="radio" class="value" value="200" name="children">200</label></li>
            <li><label><input type="radio" class="value" value="300" name="children">300</label></li>
          </ul>
          <label><input type="radio" value="0" name="parent1" class="parent">none</label>
        </div>
      </td>
    </tr>
  </table>

  <table class="output">
    <tr>
      <td><label>Total : <input type="text" class="total" value="0">yen</label></td>
    </tr>
    <tr>
      <td><label>30% extra:<input type="text" class="totalPer130" value="0">yen</label></td>
    </tr>
    <tr>
      <td><label>30% discount:<input type="text" class="totalPer70" value="0">yen</label></td>
    </tr>
    <tr>
      <td><input type="reset" value="リセット"></td>
    </tr>
  </table>
</form>

(Обратите внимание, что я сделал одно небольшое изменение в HTML: у вас был элемент <label>, обертывающий как флажки numInput, так и поле ввода «pages». Это означало, что щелчки в поле ввода также непреднамеренно переключали значение флажка. Я переместил элемент текстовое поле за пределами этого элемента метки.)

04.02.2019
  • Замечательно! Это сработало. Большое спасибо за вашу помощь и исправление моих опечаток и грамматических ошибок :) 06.02.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...