Почему e.target.style.backgroundColor не обновляется, если цвет был определен вне функции?

Это эскизный проект, который я пытаюсь сделать, у меня работают две основные функции: оттенки серого (с каждым проходом становится темнее) и радуга, которая выводит случайный цвет при наведении.

Затем я хотел добавить предустановленные цвета, но по какой-то причине они не обновляются. Я пробовал все, что мог придумать, например, добавление значения в массив, который сохраняет только текущее значение, до установки 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>

@CollinD Я сузил это, насколько мог

rodpadev 12.03.2019 20:28

Хорошо, спасибо, что нашли время, чтобы сделать ваш вопрос более читабельным!

CollinD 12.03.2019 21:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
2 118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Там опечатка, вы определяли свои цвета как rbga, но это должно быть rgba:

currentColor = "rgba(0, 0, 255, 1)"

https://jsfiddle.net/y83qou9r/

потратил 2 часа на выяснение проблемы, и это была опечатка ... Спасибо, теперь я буду помнить, чтобы яростно проверять опечатки

rodpadev 12.03.2019 20:39

Другие вопросы по теме