<div class="wa-quantity-box">
<button class="js-decrease">-</button>
<input class="js-product-quantity" type="text" value="1" data-step="4" data-max-quantity="16">
<button class="js-increase">+</button>
</div>
<div class="wa-quantity-box">
<button class="js-decrease">-</button>
<input class="js-product-quantity" type="text" value="1" data-step="" data-max-quantity="0">
<button class="js-increase">+</button>
</div>
<div class="wa-quantity-box">
<button class="js-decrease">-</button>
<input class="js-product-quantity" type="text" value="1" data-min-quantity="0">
<button class="js-increase">+</button>
</div>
(function() {
// проверяем поддержку
if (!Element.prototype.matches) {
// Полифилл для .matches
// определяем свойство
Element.prototype.matches = Element.prototype.matchesSelector ||
Element.prototype.webkitMatchesSelector ||
Element.prototype.mozMatchesSelector ||
Element.prototype.msMatchesSelector;
}
// Полифилл для .closest
// проверяем поддержку
if (!Element.prototype.closest) {
// реализуем
Element.prototype.closest = function(css) {
var node = this;
while (node) {
if (node.matches(css)) return node;
else node = node.parentElement;
}
return null;
};
}
})();
// Количество и кратность
document.addEventListener('DOMContentLoaded', function(){
//Обходим все инпуты и при наличии data-step присваиваем его инпуту
let inputs = document.querySelectorAll('.wa-quantity-box .js-product-quantity');
inputs.forEach(function(el) {
increase = el.closest('.wa-quantity-box').querySelector('.js-increase');
decrease = el.closest('.wa-quantity-box').querySelector('.js-decrease');
el.value = parseInt(el.getAttribute('data-step')) || 1;
// Убираем все лишнее при изменении input
function Validate() {
this.value = this.value.replace(/[^0-9]/g, '');
const maxQuantity = parseInt(el.getAttribute('data-max-quantity')) || 0;
this.value = maxQuantity > 0 && this.value >= maxQuantity ? maxQuantity : this.value;
this.value = this.value <= 1 ? 1 : this.value;
}
// Проверяем кратность при изменении и добавляем до минимальной кратной в большую
function Divisible(){
if ( this.getAttribute('data-step')) {
let value = parseInt(this.value);
let round = parseInt(this.getAttribute('data-step'));
let remainder = this.value % round;
if ( remainder != 0 ) {
this.value = value + round - remainder;
}
}
}
// Обработчики событий кликов по кнопкам
increase.addEventListener('click', function(event){
event.preventDefault();
const { value } = el;
const maxQuantity = parseInt(el.getAttribute('data-max-quantity')) || 0;
el.value = maxQuantity > 0 && parseInt(value) >= maxQuantity ? maxQuantity : parseInt(value) + (parseInt(el.getAttribute('data-step')) || 1);
});
decrease.addEventListener('click', function(event){
event.preventDefault();
const minPart = parseInt(el.getAttribute('data-step')) || 1;
el.value = parseInt(el.value) - minPart < minPart ? minPart : parseInt(el.value) - minPart;
});
// Назначаем фунции обработчики на события
el.addEventListener('input', Validate);
el.addEventListener('keyup', Validate);
el.addEventListener('change', Divisible);
});
});
var part = parseInt("1");
Без комментариев.Array.prototype.forEach.call()
. Или создать массив Array.from(qInputs).forEach()
.this.hasAttribute('data-max-quantity') == true
. Тоже оставлю без комментариев.[].forEach.call(qInputs,function(el){
function(){ ... }
var
if ( el.hasAttribute('data-step') == true && el.getAttribute('data-step') !== "" )
// =>
if(el.getAttribute('data-step'))
parseInt("1");
function (e) {
e.preventDefault();
if ( el.hasAttribute('data-step') == true && el.getAttribute('data-step') !== "" ) {
var part = parseInt(el.getAttribute('data-step'));
} else {
var part = parseInt("1");
}
if ( el.hasAttribute('data-max-quantity') == true && el.value >= parseInt(el.getAttribute('data-max-quantity')) && parseInt(el.getAttribute('data-max-quantity')) != 0 ) {
var count = parseInt(el.getAttribute('data-max-quantity'));
} else {
var count = parseInt(el.value) + part;
}
el.value = count;
}
// =>
(event) => {
event.preventDefault();
const { value } = el;
const maxQuantity = parseInt(el.getAttribute('data-max-quantity')) || 0;
el.value =
maxQuantity > 0 && value >= maxQuantity
? maxQuantity
: value + (parseInt(el.getAttribute('data-step')) || 1);
}
count = count < part ? part : count;
el.value = count;
if (this.value.match(/[^0-9]/g)) {
this.value = this.value.replace(/[^0-9]/g, '');
}
parseInt(this.getAttribute('data-step')) == "" || this.value <= "1"