1

Хотела бы уточнить 1 деталь касательно одного проекта, который я сейчас делаю. В общем, дело в том, что я хочу его немного изменить, но за 2 часа не получилось этого сделать, потому решила поискать помощи тут.

При оригинальном коде мы видим на странице такой текст - Background colour: #00ffff (например). А мне бы хотелось чтобы это выглядело так- Background colour: Aqua.

Т.е., чтобы цвет писался словами. Ниже я сперва покажу оригинальный код, а затем со своими попытками достичь результат. Сразу скажу, что при моем варианте я смогла достичь того, что при первом нажатии на кнопку все ок, но при последующих нажатиях вообще ничего не происходит. Моя идея была в том, чтоб система шла по объекту и по очереди выводила названия цветов. Но вот выводит почему-то только первый цвет и на этом все.

Изначальный код

const button = document.getElementById("btn");
const color = document.querySelector(".color");
const hex = [ 
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"A",
"B",
"C",
"D",
"E",
"F"
];
button.addEventListener("click", () => {
 let hexColor = generateHex();
 document.body.style.backgroundColor = hexColor;
 color.textContent = hexColor;
});
function generateHex() {
let hexColor = "#"
 for (let i = 0; i < 6; i++) {
 hexColor += hex[getRandomNumber()]
 }
 return hexColor;
 }
function getRandomNumber() {
return Math.floor(Math.random() * hex.length);
}
}

Измененный код

const button = document.getElementById("btn");
const color = document.querySelector(".color");
button.addEventListener("click", () => {
 let hexColor = generateHex();
 document.body.style.backgroundColor = hexColor;
 color.textContent = hexColor;
});
function generateHex() {
 const newObject = {
 Aqua: "#00ffff",
 Gray: "#808080",
 Navy: "#000080",
 Green: "#008000",
 Olive: "#808000"
 };
 for (const key in newObject ) {
 
 return(key);
 
 }
 const keys = Object.keys(newObject);
keys.forEach(key => {
 return(key);
});
}

Пробовала и другие варианты, но результат 1 - дает только 1 раз нажать на кнопку, а потом не реагирует на последующие нажатия.

Буду очень благодарна вашей помощи!

SwaD
11.8k9 золотых знаков17 серебряных знаков32 бронзовых знака
задан 22 дек. 2022 в 11:51
4
  • так у вас функция generateHex просто перебирает объект в цикле for и сразу возвращает первый элемент из за return, до второго return'a код даже не доходит, да и не понятно зачем он тут Commented 22 дек. 2022 в 11:58
  • если вы хотите менять фон последовательно, создайте массив объектов с цветами, а по нажатию на кнопку возвращайте i + 1ый элемент Commented 22 дек. 2022 в 12:00
  • или случайный цвет, как угодно Commented 22 дек. 2022 в 12:01
  • Sergey, спасибо Вам за ответ. Да, оказалось все из-за второго return'a. Commented 22 дек. 2022 в 22:26

1 ответ 1

0

У вас ошибка была в том, что вы в цикле for делали return. return прерывает выполнение цикла и функции, таким образом получали всегда ключ Aqua, т.к. он идет первым в вашем объекте.

Исправить поведение можно следующим образом:

const button = document.getElementById("btn");
const color = document.querySelector(".color");
button.addEventListener("click", () => {
 let hexColor = generateHex();
 document.body.style.backgroundColor = hexColor[1];
 color.textContent = hexColor[0];
});
function generateHex() {
 const newObject = {
 Aqua: "#00ffff",
 Gray: "#808080",
 Navy: "#000080",
 Green: "#008000", 
 Olive: "#808000" 
 };
 const colorArr = Object.entries(newObject);
 return colorArr[Math.round(Math.random() * (colorArr.length - 1))];
}
<div class="color"></div>
<button id='btn'>Жмяк</button>

Функция возвращает массив из 2х элементов. 1й элемент ключ, 2й значение.

ответ дан 22 дек. 2022 в 12:08
3
  • SwaD, огромное Вам спасибо за совет. Теперь все прекрасно! Подумала над Вашим вариантом, осознала вроде. Все работает как надо! Commented 22 дек. 2022 в 22:27
  • сделала, еще раз большое спасибо за помощь :)) Commented 22 дек. 2022 в 22:33
  • 1
    Обращайтесь, тут всегда рады помочь ) Commented 22 дек. 2022 в 22:39

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.