Сбор входных данных и отображение их в div - PullRequest
2 голосов
/ 06 мая 2020

У меня есть несколько вводов количества. Я хочу собрать данные во «входах» и показать их в «#yolcudropdown». Но я просто не могу вытащить данные. Входы должны быть отключены. Ручного ввода быть не должно. Я что-то сделал внизу раздела "javascript". Но я не смог его запустить.

(function( $ ) {
    $.fn.number = function(customOptions) {
        var options = {
            'containerClass' : 'number-style',
            'minus' : 'number-minus',
            'plus' : 'number-plus',
            'containerTag' : 'div',
            'btnTag' : 'span'
        };
        options = $.extend(true, options, customOptions);
        var input = this;
        input.wrap('<' + options.containerTag + ' class="' + options.containerClass + '">');
        var wrapper = input.parent();
        wrapper.prepend('<' + options.btnTag + ' class="' + options.minus + '"></' + options.btnTag + '>');
        var minus = wrapper.find('.' + options.minus);
        wrapper.append('<' + options.btnTag + ' class="' + options.plus + '"></' + options.btnTag + '>');
        var plus = wrapper.find('.' + options.plus);
        var min = input.attr('min');
        var max = input.attr('max');
        if(input.attr('step')){
            var step = +input.attr('step');
        } else {
            var step = 1;
        }
        if(+input.val() <= +min){
            minus.addClass('disabled');
        }
        if(+input.val() >= +max){
            plus.addClass('disabled');
        }
        minus.click(function () {
            var input = $(this).parent().find('input');
            var value = input.val();
            if(+value > +min){
                input.val(+value - step);
                if(+input.val() === +min){
                    input.prev('.' + options.minus).addClass('disabled');
                }
                if(input.next('.' + options.plus).hasClass('disabled')){
                    input.next('.' + options.plus).removeClass('disabled')
                }
            } else if(!min){
                input.val(+value - step);
            }
        });
        plus.click(function () {
            var input = $(this).parent().find('input');
            var value = input.val();
            if(+value < +max){
                input.val(+value + step);
                if(+input.val() === +max){
                    input.next('.' + options.plus).addClass('disabled');
                }
                if(input.prev('.' + options.minus).hasClass('disabled')){
                    input.prev('.' + options.minus).removeClass('disabled')
                }
            } else if(!max){
                input.val(+value + step);
            }
        });
    };
})(jQuery);

$('.quntity-input').each(function () {
  $(this).number();
});




/* THIS IS IMPORTANT */
$(document).ready(function() {
  $(document).on('change', '.btw', function() {
    $('#yolcudropdown').text($(this).val());
  });
});
.number-style {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  -ms-flex-pack: start !important;
  justify-content: flex-start !important;
  -ms-flex-align: center !important;
  align-items: center !important;
}
.number-style .number-minus,
.number-style .number-plus {
  height: 28px;
  background: #ffffff;
  border: 2px solid #e2e2e2 !important;
  width: 28px;
  -webkit-border-radius: 100%;
  -moz-border-radius: 100%;
  -ms-border-radius: 100%;
  border-radius: 100%;
  line-height: 23px;
  font-size: 19px;
  font-weight: 700;
  text-align: Center;
  border: none;
  display: block;
  cursor: pointer;
}
.number-style .number-minus:active,
.number-style .number-plus:active {
  background: #e2e2e2;
}
.number-style .number-minus {
  line-height: 20px;
}
.number-style .number-minus::after {
  content: "-";
  font-size: 10px;
}
.number-style .number-plus {
  line-height: 18px;
}
.number-style .number-plus::after {
  content: "+";
  font-size: 10px;
}
.number-style .quntity-input {
  width: 28px;
  background: #e00f23;
  -webkit-border-radius: 100%;
  -moz-border-radius: 100%;
  -ms-border-radius: 100%;
  border-radius: 100%;
  line-height: 21px;
  font-size: 14px;
  color: #ffffff;
  font-weight: 700;
  text-align: Center;
  margin: 0 5px;
  display: block;
  cursor: pointer;
  text-align: center;
  border: none;
  height: 28px;
  font-weight: 600;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="quntity-input btw" type="text" value="0" step="1" min="0" max="10">
<input class="quntity-input btw" type="text" value="0" step="1" min="0" max="10">

<div id="yolcudropdown">İnput quantity show this div</div>

Имена «классов» для «входных» элементов совпадают. Мне нужно собирать входы с одинаковым значением и мгновенно отображать их в div

1 Ответ

3 голосов
/ 07 мая 2020

HTMLInputElement

Input type "text" не имеет атрибутов min max или step, поэтому ваш HTML абсолютно неверно . Старайтесь не писать Работает, я фреймворк -код. Соблюдайте стандарты W3 C. Используйте type="number" (CSS псевдонимы могут помочь вам удалить стрелки по умолчанию spinner из таких элементов)

Также step может быть плавающими. Уважайте это и используйте parseFloat() в JS

CSS Flex для выравнивания материала

Кажется, вы знаете о CSS -flex, используйте его! Высота, значит - строка-высота ... 19? 20? 23px? Нет. Просто используйте flex .

CSS! Important

!important является признаком плохого стиля кодирования, и его следует оставить только для Bootstrap. Или в надежде переопределить Bootstrap стилей - или в тех случаях, когда разработчики действительно знают, что они делают.

jQuery Плагины

jQuery плагины , я предлагаю прочитать DOCS и получить более глубокие знания о том, как работают плагины. Почти каждый jQuery метод - это плагин. .hide(), .addClass() ... Я не буду их всех считать. Плагины объединяются в цепочки .removeClass("foo").stop().fadeTo(1), и таким же должен быть ваш .number() плагин.
Чтобы достичь цепочки, вы просто возвращаете привязку this. PS: это не jQuery ... так работает JS.

jQuery Плагины не предназначены для вызова внутри $.each() l oop. $() уже представляет собой коллекцию узлов DOM, заключенных в объект jQuery. Не нужно .each(). То же самое: вы бы предпочли использовать $('a').css({color:'blue'}) вместо $('a').each(){ $(this).css({color: 'blue'}); });. Тот же эффект, меньше кода. Плагины.

jQuery Готовность к DOM

jQuery(function($) { }); // DOM ready and $ alias in scope

Или, если вас не волнует ± IE, или вы используете синтаксис ES6 и набор инструментов, например Babel, чем: jQuery($ => { }) будет достаточно.

jQuery $ Object Constructor

jQuery позволяет вам определить HTMLElement , который в конечном итоге станет новым элементом DOM, обернутым всеми jQuery полномочия, методы. Это означает, что если вместо передачи селектора вы передадите более сложную строку, похожую на тег (скажем: $("<span/>", {}); - jQuery, создаст элемент inMemory SPAN и позволит вам использовать второй параметр {} для большинства доступных jQuery методов для этого $ Element . Давайте воспользуемся этим!

jQuery обратные вызовы плагина

Если вы хотите предоставить обратный вызов после того, как пользователь изменит входное значение, предоставьте метод обратного вызова . Не заставляйте программиста писать новый код спагетти , придерживайтесь в объем доступных внутренних методов плагина.

Значения сумм элементов

Для суммирования значений элементов вы можете использовать Array.prototype.reduce , просто убедитесь, что вы используете initialValue для предотвращения возможных ошибок типа.


Пример

Наконец, вот упрощенный CSS и улучшенный JS:

(function($) {
  $.fn.number = function(customOptions) {

    const options = $.extend(true, {
      containerTag: "div",
      containerClass: "number-style",
      minusClass: "number-minus", // consistency in wording!
      minusText: "-", // Give power to the user!
      plusClass: "number-plus",
      plusText: "+",
      btnTag: "button",
      onChange() {}, // Provide a nifty callback!
    }, customOptions);

    this.each(function() { // Use .each() here!

      const $input = $(this);
      let val = parseFloat($input.value || 0); // floats! 
      const min = parseFloat($input.attr("min"));
      const max = parseFloat($input.attr("max"));
      const step = parseFloat($input.is("[step]") ? $input.attr("step") : 1);

      const handleStyles = () => {
        $minus.toggleClass('disabled', val <= min);
        $plus.toggleClass('disabled', val >= max);
      };
      
      const change = () => {
        val = Math.max(min, Math.min(max, val)); // Keep val in range.
        $input.val(val); // Update input value
        handleStyles();  // Update styles
        options.onChange.call($input[0], val); // Trigger a public callback
      }

      const decrement = () => {
        val -= step;
        change();
      };

      const increment = () => {
        val += step;
        change();
      };

      const $minus = $(`<${options.btnTag}>`, {
        type: "button",
        title: "Decrement",
        class: options.minusClass,
        text: options.minusText,
        on: {
          click: decrement
        }
      });

      const $plus = $(`<${options.btnTag}>`, {
        class: options.plusClass,
        title: "Increment",
        text: options.plusText,
        on: {
          click: increment
        }
      });

      const $wrapper = $(`<${options.containerTag}>`, {
        class: options.containerClass,
      });

      $input.after($wrapper);
      $wrapper.append($minus, $input.detach(), $plus); // Append all
      handleStyles(); // handle initial styles

    });

    return this; // make your plugin chainable!

  };
})(jQuery);



jQuery(function($) { // DOM ready and $ alias in scope

  const $quantityInp = $('.quantity-input'); // Cache your elements!
  const $dropdown = $('#yolcudropdown'); // Cache your elements!

  $quantityInp.number({
    onChange(val) { // our custom onChange callback!
      const tot = $quantityInp.get().reduce((acc, el) => {
        acc += parseFloat(el.value);
        return acc;
      }, 0);
      $dropdown.text(tot);
    }
  });

});
/* QuickReset */ * { margin:0; box-sizing:border-box; }

.number-style input::-webkit-outer-spin-button,
.number-style input::-webkit-inner-spin-button {
  -webkit-appearance: none;
}

.number-style {
  display: flex;
}

.number-style > * {
  height: 2em;
  min-width: 2em;
  border-radius: 2em;
  display: flex;            /* Use flex. */
  justify-content: center;
  text-align: center;
  border: 0;
  background: #ddd;
}

.number-style button {
  background: #fff;
  box-shadow: inset 0 0 0 2px #ccc;
  cursor: pointer;
  user-select: none;
  /* no highlight, please! */
}

.number-style button:active {
  background: #0bf;
}

.number-style input {
  background: #e00f23;
  color: #fff;
  margin: 0 5px;
}

.number-style .disabled {
  opacity: 0.2;
  cursor: default;
}


/* Custom overrides: */

.number-style>* {
  width: 2em;
  /* just for roundness */
}
<input class="quantity-input" type="number" value="0" step="1" min="0" max="10">
<input class="quantity-input" type="number" value="0" step="1" min="0" max="10">

<div id="yolcudropdown">0</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

Дополнительное чтение:

И PS: это «количество» , а не «количество»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...