Cara, seu código funciona e é claro no que faz. E acho que isso é o que mais importa. No entanto, eu sempre tento pensar em deixar código de forma que a manutenção no futuro seja fácil. Por exemplo, ao invés de criar um id para cada botão, você poderia criar um atributo igual para todos os botões e outro atributo com a url da imagem. Ficaria mais ou menos assim:
No HTML criamos o atributo data-button
para cada botão e adicionamos outro atributodata-image-url
que armazena a url da imagem que irá aparecer quando aquele botão for clicado:
<button data-button data-image-url=¨/public/azul-off.opti.webp¨>Blue</button>
<button data-button data-image-url=¨/public/orange-off.opti.webp¨>Orange</button>
<button data-button data-image-url=¨/public/pink-off.opti.webp¨>Pink</button>
<!-- ... -->
E aí no Javascript você apenas cria um loop que vai automaticamente adicionar os event listeners para cada botão:
document.querySelectorAll('[data-button]').forEach(button => {
button.addEventListener('click', () => {
changeImage(button.dataset.imageUrl)
})
}
Desta forma, se no futuro você precisar adicionar uma nova cor, a única coisa que você vai precisar fazer é adicionar um novo botão com a URL da nova imagem.
Se você nunca utilizou atributos do tipo data
talvez este código esteja um pouco confuso para você. Link para você entender melhor sobre os data attributes.
Espero ter ajudado!
achei muito interessante essa abordagem com data. é disso que to falando ficaria mais enxuto o codigo, esse tipo de filling que preciso pegar sabe
O problema é que cada vez que clicar no botão branco ou preto, um novo listener é adicionado a todos os outros botões.
E como addEventListener
é acumulativo, no fim cada botão pode acabar ficando com vários listeners, o que é desnecessário.
Eu detalho melhor esse problema no meu comentário.
Mas a ideia de usar dataset
é boa, tanto que acabei usando também - de uma forma diferente, embora a ideia geral seja similar.