Reputation: 105
I have two text inputs, and two date inputs. I created a variable and selected them all with a class using QuerySelectorAll, and put an click listener on it. The function on the listener changes the textContent of a div element to "", or blank.
However no matter what, I cant seem to get this to work with QuerySelectorAll. It works if i run this logic and select one of the inputs with an ID, but not if i try to create a class which selects all 4 input elements. What am i doing wrong?
const getSum = () => {
const inputs = ['dateInput1', 'dateInput2'];
const outputs = ['result1', 'result2'];
const arr = inputs.map(input => {
return document.getElementById(input).value;
});
if(arr.every(element => !!element)){
inputs.forEach((input, index) => {
const inputValue = document.getElementById(input).value;
if (inputValue.match(dateRegEx)) {
var sum = 0;
for (var i = 0; i < inputValue.length; i++) {
const num = parseInt(inputValue.charAt(i));
if (!isNaN(num)) {
sum += num;
}
}
const total = (sum - 1) % 9 + 1;
document.getElementById(outputs[index]).textContent = "Your number is: " + total;
}
});
} else {
document.getElementById("errorMsg").textContent = "*error* please enter two dates and two names";
}
}
const sumButton = document.querySelector(".sumNumbers");
sumButton.addEventListener("click", getSum);
const dateRegEx = /^(19|20)\d{2}-(0\d{1}|1[0-2])-([0-2]\d{1}|3[0-1])$/;
function clearErrorMsg(){
document.getElementById("errorMsg").textContent = "";
}
const cLickDeletesError = document.querySelectorAll(".clickClear");
Array.from(clickDeletesError).forEach(function(cde){
cde.addEventListener("click", clearErrorMsg);
}
const dateRegEx = /^(19|20)\d{2}-(0\d{1}|1[0-2])-([0-2]\d{1}|3[0-1])$/;
function clearErrorMsg(){
document.getElementById("errorMsg").textContent = "";
}
const cLickDeletesError = document.querySelectorAll(".clickClear");
Array.from(clickDeletesError).forEach(function(cde){
cde.addEventListener("click", clearErrorMsg);
}
Upvotes: 1
Views: 47
Reputation: 50291
querySelectorAll
returns a collection, So you cannot directly add event listener to it. So use spread syntax to get an array from it. Then use forEach
to iterate and add event listener
function clearErrorMsg() {
document.getElementById("errorMsg").textContent = "";
}
[...document.querySelectorAll(".clickClear")].forEach((e) => {
e.addEventListener("click", clearErrorMsg)
});
<div class="cell-1" id="centerElement">
<div id="cell-1-nest-l"></div>
<div id="cell-2-nest-l"></div>
<div id="cell-3-nest-l"></div>
<div id="cell-4-nest-l"></div>
<div id="cell-5-nest-l"></div>
<div id="cell-6-nest-l">
<input type="text" class="nameStyle1 clickClear" id="nameInput1" placeholder="Your Name"></div>
</div>
<div id='errorMsg'> Here is Error</div>
Another alternative is use of querySelector
instead of querySelectorAll
. This is because there is only one relevant element with that class. So using querySelectorAll
is an overhead in this case
function clearErrorMsg() {
document.getElementById("errorMsg").textContent = "";
}
document.querySelector(".clickClear").addEventListener("click", clearErrorMsg)
<div class="cell-1" id="centerElement">
<div id="cell-1-nest-l"></div>
<div id="cell-2-nest-l"></div>
<div id="cell-3-nest-l"></div>
<div id="cell-4-nest-l"></div>
<div id="cell-5-nest-l"></div>
<div id="cell-6-nest-l">
<input type="text" class="nameStyle1 clickClear" id="nameInput1" placeholder="Your Name"></div>
</div>
<div id='errorMsg'> Here is Error</div>
Upvotes: 2