Is it possible to delegate blur
event?
I have this code and want to add only one event listener to whole div
where are my inputs:
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 = `Value must be between ${input.min} and ${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="one" type="number" min="10" max="24" placeholder="One">
<input name="two" type="number" min="5" max="7" placeholder="Two">
</div>
I tried to add even listener to div
but nothing happens when I click outside of div
const inputsDiv = document.querySelector('div.div');
inputsDiv.addEventListener('blur', console.log);
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
outline: 1px solid black;
}
.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="one" type="number" min="10" max="24" placeholder="One">
<input name="two" type="number" min="5" max="7" placeholder="Two">
</div>
Only if I add tabindex="0"
attribute to div
I can see event target but it always is div
:
const inputsDiv = document.querySelector('div.div');
inputsDiv.addEventListener('blur', (e) => console.log(e.target, e.currentTarget));
.div {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
align-items: flex-start;
outline: 1px solid black;
}
.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" tabindex="0">
<input name="one" type="number" min="10" max="24" placeholder="One">
<input name="two" type="number" min="5" max="7" placeholder="Two">
</div>