greenfox07
@greenfox07

Как сделать ограничение на уменьшение числа в input?

<button class="minus">minus</button>
<input class="numb" type="text" value="3" size="1">
<button class="plus">plus</button>

$('.minus').click(function() {
  let count = $('.numb');
  count.val(parseInt(count.val())-1);
})
$('.plus').click(function() {
  let count = $('.numb');
  count.val(parseInt(count.val())+1);
})

https://codepen.io/mamedov94/pen/WgOXZR

Как с помощью jQuery сделать ограничение на уменьшение числа в input? Типа нажимаешь на кнопку минус, и как доходит число до 3, число перестает уменьшаться.
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Добавить input'у атрибуты min/max; всем трём элементам добавить общую обёртку (уверен, на странице подобных блоков будет больше одного):

<div class="counter">
  <button class="minus">-</button>
  <input type="number" min="2" max="17" value="5">
  <button class="plus">+</button>
</div>

При обновлении input'а ограничивать новое значение значениями атрибутов min/max (если где-то ограничений быть не должно, то вместо отсутствующих значений атрибутов подставлять +/- бесконечность). Кроме того, неплохо бы обрабатывать пользовательский ввод в input - а ну как кто захочет его напрямую отредактировать, мимо кнопок.

Как это может выглядеть:

const updateInput = change => e =>
  $('input', e.delegateTarget).val(function(i, v) {
    const min = this.min || -Infinity;
    const max = this.max || Infinity;
    return Math.max(min, Math.min(max, (v | 0) + change));
  });

$('.counter')
  .on('click', '.minus', updateInput(-1))
  .on('click', '.plus', updateInput(1))
  .on('input', updateInput(0));

Или, к чёрту jquery:

const updateInput = change => e => {
  const input = e.target.closest('.counter').querySelector('input');
  const min = input.min || -Infinity;
  const max = input.max || Infinity;
  input.value = Math.min(max, Math.max(min, (input.value | 0) + change));
};

document.querySelectorAll('.counter').forEach(function(n) {
  n.querySelector('.minus').addEventListener('click', this[0]);
  n.querySelector('input').addEventListener('input', this[1]);
  n.querySelector('.plus').addEventListener('click', this[2]);
}, [ -1, 0, 1 ].map(updateInput));

Или, не обязательно назначать обработчики событий каждому элементу индивидуально, достаточно по одному делегированному на тип события:

document.addEventListener('click', ({ target: t }) => {
  const change =
    t.classList.contains('plus')  ? +1 :
    t.classList.contains('minus') ? -1 :
                                     0;
  if (change) {
    const input = t.closest('.counter').querySelector('input');
    input.value -= -change;
    input.dispatchEvent(new Event('input'), { bubbles: true });
  }
});

document.addEventListener('input', ({ target: t }) => {
  if (t.closest('.counter')) {
    t.value = Math.min(t.max || Infinity, Math.max(t.min || -Infinity, t.value | 0));
  }
});

А ещё можно добавить кнопкам data-атрибуты, указывающие, на сколько должно быть изменено значение input'а, и тогда проверять у кнопок наличие классов будет не надо:

<button class="minus" data-change="-1">-</button>
<button class="plus" data-change="+1">+</button>

document.addEventListener('input', updateInput);
document.addEventListener('click', updateInput);

function updateInput({ target: t }) {
  const counter = t.closest('.counter');
  if (counter) {
    const input = counter.querySelector('input');
    const min = input.min || -Infinity;
    const max = input.max || Infinity;
    input.value = Math.min(max, Math.max(min, (input.value | 0) + (t.dataset.change | 0)));
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vanton
@vanton
Человек и пароход
Если это input type="number", то аттрибутом min="3"
Ответ написан
Комментировать
Symphony
@Symphony Куратор тега JavaScript
$('.minus').click(function() {
  let count = $('.numb');
  if(count.val() > 3)
    count.val(parseInt(count.val())-1);
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
24 апр. 2024, в 19:51
1000 руб./за проект
24 апр. 2024, в 19:40
5000 руб./за проект
24 апр. 2024, в 19:18
50000 руб./за проект