Это эскизный проект, который я пытаюсь сделать, у меня работают две основные функции: оттенки серого (с каждым проходом становится темнее) и радуга, которая выводит случайный цвет при наведении.
Затем я хотел добавить предустановленные цвета, но по какой-то причине они не обновляются. Я пробовал все, что мог придумать, например, добавление значения в массив, который сохраняет только текущее значение, до установки e.target.style.backgroundColor = className[0];, которая работает.
Проблема в том, что я хочу использовать свои собственные оттенки цветов, а не предопределенные имена цветов css (я знаю, что значения rgb, которые у меня есть, такие же, как значения по умолчанию, но это временно).
Я полагал, что если я назначу значение currentColor внутри функции updateColor(), оно сработает, но, конечно, потеряет всю гибкость.
Я поместил console.info() внутри функции, чтобы увидеть, получает ли она значение, и это так, но по какой-то причине он вообще не обновляется.
PS: заранее извиняюсь за корявый код
Обновлено: отредактировано в минимальном, полном и проверяемом примере
const grid = document.querySelector(".grid");
const clear = document.querySelector("#clear");
clear.addEventListener("click", reset);
function createDivs(){
for(i = 1; i < 16 * 16 + 1; i++){
let createdDivs = document.createElement("div")
grid.appendChild(createdDivs)
createdDivs.setAttribute("class", "grid-element" )
}
grid.style.gridTemplateColumns = `repeat(${16}, 1fr)`
grid.style.gridTemplateRows = `repeat(${16}, 1fr)`
}
createDivs();
function reset(){
let divs = document.querySelectorAll(".grid-element")
divs.forEach(function(div){
div.parentNode.removeChild(div);
});
createDivs();
}
const li = document.querySelectorAll("ul li")
li.forEach(function(e){
e.addEventListener("click", fetchClassName)
})
let className = ["black"]
let oldClassName = ["black"]
let currentColor = "black"
function fetchClassName(e){
className.unshift(e.srcElement.className);
oldClassName = className.pop();
setColor();
}
function setColor(){
let divs = document.querySelectorAll(".grid-element");
switch(className[0]){
case "rainbow":
divs.forEach(function(div){
div.removeEventListener("mouseover", updateColor);
div.addEventListener("mouseover", skittles);
})
break;
case "blue":
currentColor = "rbga(0, 0, 255, 1)"
for (y = 0; y < divs.length; y++){
let div = divs[y];
div.removeEventListener("mouseover", skittles);
div.addEventListener("mouseover", updateColor);
}
break;
}
}
function updateColor(e){
e.target.style.backgroundColor = currentColor //className[0] works but not what I want
console.info(currentColor)
}
function skittles(e){
let r = Math.floor(Math.random() * 256);
let g = Math.floor(Math.random() * 256);
let b = Math.floor(Math.random() * 256);
let rgb = `rgba(${r}, ${g}, ${b}, 0.5)`
e.target.style.backgroundColor = rgb;
}.grid {
display: grid;
height: 550px;
width: 550px;
}
.grid-element {
grid-area: auto;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
border-left: 1px solid rgba(0, 0, 0, 0.1);
}
ul li:hover {
cursor: pointer;
}<div class = "container">
<div class = "grid"></div>
</div>
<div>
<button type = "button" id = "clear">Clear Canvas</button>
<ul>
<li class = "blue">blue</li>
<li class = "rainbow">rainbow</li>
</ul>
</div>Хорошо, спасибо, что нашли время, чтобы сделать ваш вопрос более читабельным!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Там опечатка, вы определяли свои цвета как rbga, но это должно быть rgba:
currentColor = "rgba(0, 0, 255, 1)"
https://jsfiddle.net/y83qou9r/
потратил 2 часа на выяснение проблемы, и это была опечатка ... Спасибо, теперь я буду помнить, чтобы яростно проверять опечатки
@CollinD Я сузил это, насколько мог