Как сократить JS код
Подскажите, пожалуйста, как можно сократить приведенный ниже JS код. В примере 2 инпута, а если их будет 20, то такой способ записи очень большой.
document.getElementById("shirina").onblur = function() {
if (shirina.value < 10) {
error1();
document.getElementById("shirina").value = "10";
} else if (shirina.value > 24) {
document.getElementById("shirina").value = "24";
error1();
}
}
document.getElementById("dlina").onblur = function() {
if (dlina.value < 5) {
error2();
document.getElementById("dlina").value = "5";
} else if (dlina.value > 7) {
document.getElementById("dlina").value = "7";
error2();
}
}
function error1() {
let p1 = document.createElement('p');
p1.className = "erorr-m";
p1.innerHTML = "Значение от 10 до 24";
shirina.after(p1);
setTimeout(function() {
p1.remove();
}, 3000);
}
function error2() {
let p2 = document.createElement('p');
p2.className = "erorr-m";
p2.innerHTML = "Значение от 5 до 7";
dlina.after(p2);
setTimeout(function() {
p2.remove();
}, 3000);
}
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
}
.erorr {
border: solid 2px #e66565;
}
.erorr-m {
margin-bottom: 10px;
padding: 10px;
color: #e66565;
border-left: solid 2px #e66565;
animation: 1s fadeIn;
}
<div class="div">
<input name="shirina" type="number" min="10" max="24" id="shirina" placeholder="Ширина">
<input name="dlina" type="number" min="5" max="7" id="dlina" placeholder="Длина">
</div>
Ответы (3 шт):
Автор решения: Алексей Р
→ Ссылка
Можно сделать словарь с параметрами и в цикле задать все обработчики. Функцию error сделать одну, но с параметрами.
d = {
"shirina": {
"min": 10,
"max": 24
},
"dlina": {
"min": 5,
"max": 7
}
}
Object.keys(d).forEach(k => {
document.getElementById(k).onblur = function() {
if (this.value < d[k]["min"]) {
this.value = d[k]["min"]
error(this, k);
}
if (this.value > d[k]["max"]) {
this.value = d[k]["max"]
error(this, k);
}
}
})
function error(el, k) {
let p1 = document.createElement('p');
p1.className = "erorr-m";
p1.innerHTML = `Значение от ${d[k]["min"]} до ${d[k]["max"]}`;
el.after(p1);
setTimeout(function() {
p1.remove();
}, 3000);
}
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
}
.erorr {
border: solid 2px #e66565;
}
.erorr-m {
margin-bottom: 10px;
padding: 10px;
color: #e66565;
border-left: solid 2px #e66565;
animation: 1s fadeIn;
}
<div class="div">
<input name="shirina" type="number" min="10" max="24" id="shirina" placeholder="Ширина">
<input name="dlina" type="number" min="5" max="7" id="dlina" placeholder="Длина">
</div>
Автор решения: puffleeck
→ Ссылка
в любой непонятной ситуации проксируй часто используемые методы с длинными именами
var g = function(x){return document.getElementById(x)}
/*если надо взаимодействовать с множеством инпутов,
запихни их все в одну форму и обращайся к ним через неё*/
var form = document.getElementById('f');
console.log(f.a.value);
var abc = 'abcdef';
for(let i=0; f[abc[i]]; i++)
{console.log(f[abc[i]].value);}
form > *{display: list-item;}
form > *:invalid{background: pink;}
<form id='f'>
<input type='number' id='a' value='21'>
<input type='number' id='b' value='-1113'>
<input type='number' id='c' value='55'>
<input type='number' id='d' value='4'>
<input type='number' id='e' value='5333'>
<input type='number' id='f' value='-15'>
</form>
<p id='abc'></p>
Автор решения: EzioMercer
→ Ссылка
Можно выбрать все input-ы и назначить каждому слушателя:
const inputs = document.querySelectorAll('div.div input[type="number"]');
inputs.forEach(input => {
input.addEventListener('blur', () => {
const value = +input.value;
const [min, max] = [+input.min, +input.max];
if (!(value < min || value > max)) return;
input.value = Math.max(min, Math.min(value, max));
showRangeError(input);
})
})
function showRangeError(input) {
const error = document.createElement('p');
error.className = "erorr-m";
error.innerHTML = `Значение от ${input.min} до ${input.max}`;
input.after(error);
setTimeout(() => error.remove(), 3000);
}
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
}
.erorr {
border: solid 2px #e66565;
}
.erorr-m {
margin-bottom: 10px;
padding: 10px;
color: #e66565;
border-left: solid 2px #e66565;
animation: 1s fadeIn;
}
<div class="div">
<input name="shirina" type="number" min="10" max="24" id="shirina" placeholder="Ширина">
<input name="dlina" type="number" min="5" max="7" id="dlina" placeholder="Длина">
</div>
А можно навесить один слушатель на весь div деленирование событий. Но слушать будем не blur, а change:
const inputsDiv = document.querySelector('div.div');
inputsDiv.addEventListener('change', (e) => {
const input = e.target;
if (input.type !== "number") return;
const value = +input.value;
const [min, max] = [+input.min, +input.max];
if (!(value < min || value > max)) return;
input.value = Math.max(min, Math.min(value, max));
showRangeError(input);
})
function showRangeError(input) {
const error = document.createElement('p');
error.className = "erorr-m";
error.innerHTML = `Значение от ${input.min} до ${input.max}`;
input.after(error);
setTimeout(() => error.remove(), 3000);
}
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
}
.erorr {
border: solid 2px #e66565;
}
.erorr-m {
margin-bottom: 10px;
padding: 10px;
color: #e66565;
border-left: solid 2px #e66565;
animation: 1s fadeIn;
}
<div class="div">
<input name="shirina" type="number" min="10" max="24" id="shirina" placeholder="Ширина">
<input name="dlina" type="number" min="5" max="7" id="dlina" placeholder="Длина">
</div>