The
addEventListener
method is cumulative; every time you call it, the specified listener is added to the event. Since you never
remove a listener[
^], the list of listeners keeps building up.
If you click image 1, you add listeners to the sliders to update the border of image 1. If you then click image 2, you add listeners to the sliders to update image 2,
in addition to the existing listeners which update image 1.
It would be better to track the selected image outside of its
click
event listener, and to use a single listener for the sliders to update the border of the selected image.
You can also use
event delegation[
^] to tidy up your code.
For example:
const arrayIMG = [...document.getElementsByTagName('img')];
let selectedImg = null;
const slider1 = document.getElementById("slider1");
const slider2 = document.getElementById("slider2");
const slider3 = document.getElementById("slider3");
let R = 0;
let G = 0;
let B = 0;
document.addEventListener("click", e => {
let target = e.target;
if (target.tagName !== "IMG") { target = target.closest("img"); }
if (!target || target === arrayIMG[0]) { return; }
selectedImg = target;
arrayIMG[0].src = selectedImg.src;
arrayIMG.forEach(i => i.style.border = "none");
selectedImg.style.border = "5px solid purple";
});
document.addEventListener("change", e => {
if (!selectedImg) {
return;
}
if (e.target === slider1) {
R = slider1.value;
} else if (e.target === slider2) {
G = slider2.value;
} else if (e.target === slider3) {
B = slider3.value;
} else {
return;
}
selectedImg.style.border = `5px solid rgb(${R},${G},${B})`;
});
Demo[
^]