Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Faça como eu fiz: Para que serve uma função?

No exercício, onde se solicita criar a função tocaSomClap, podemos chegar a ao trecho abaixo como resolução para função em JS para um único botão:

function tocaSomClap(){
    document.querySelector('#som_tecla_clap').play();
}

Ao analisar o projeto, notei que os botões seguem um padrão consistente de classes e os áudios usam o mesmo padrão nos ids. Isso permite substituir várias funções repetidas por uma única função genérica. Essa função identifica a classe específica do botão acionado, monta o id correspondente do áudio e executa o som, mantendo o código limpo e fácil de manter.

HTML:

<section class="teclado">
    <button class="tecla tecla_pom">Pom</button>
    <button class="tecla tecla_clap">Clap</button>
    <button class="tecla tecla_tim">Tim</button>

    <button class="tecla tecla_puff">Puff</button>
    <button class="tecla tecla_splash">Splash</button>
    <button class="tecla tecla_toim">Toim</button>

    <button class="tecla tecla_psh">Psh</button>
    <button class="tecla tecla_tic">Tic</button>
    <button class="tecla tecla_tom">Tom</button>
</section>

<audio  src="../sounds/keyq.wav" id="som_tecla_pom"></audio>
<audio  src="../sounds/keyw.wav" id="som_tecla_clap"></audio>
<audio  src="../sounds/keye.wav" id="som_tecla_tim"></audio>
<audio  src="../sounds/keya.wav" id="som_tecla_puff"></audio>
<audio  src="../sounds/keys.wav" id="som_tecla_splash"></audio>
<audio  src="../sounds/keyd.wav" id="som_tecla_toim"></audio>
<audio  src="../sounds/keyz.wav" id="som_tecla_psh"></audio>
<audio  src="../sounds/keyx.wav" id="som_tecla_tic"></audio>
<audio  src="../sounds/keyc.wav" id="som_tecla_tom"></audio>

JS:

function tocaSom(botao) {
    const classe = [...botao.classList].find(c => c.startsWith("tecla_"));
    const idSom = "#som_" + classe;
    const audio = document.querySelector(idSom);
    if (audio) audio.play();
}

document.querySelectorAll(".tecla").forEach(botao => {
    botao.addEventListener("click", () => tocaSom(botao));
});

Obs.: A abordagem acima no código JS, dentro de document.querySelectorAll, foi escolhida botao.addEventListener por permitir múltiplos handlers para o mesmo evento e ser a abordagem recomendada.
Para o caso do botao.onclick, como descrito abaixo, também tocará os sons, mas em casos de múltiplos handlers, apenas o último sobrescreveria os anteriores.

document.querySelectorAll(".tecla").forEach(botao => {
    botao.onclick = () => tocaSom(botao);
});

Gostaria de sugestões caso possa aperfeiçoar a escritas.

1 resposta
solução!

Oi, Leandro! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Sua solução ficou bem organizada e a forma como você generalizou o comportamento usando classList deixou o código limpo e direto. Gostei da atenção em manter uma função única para diferentes sons, reforçando boas práticas de manutenção.

Uma dica interessante para o futuro é usar endsWith quando quiser identificar partes finais de strings. Veja este exemplo:


let nome = "botao_clap";
if (nome.endsWith("clap")) {
    console.log("Som encontrado");
}

Esse código verifica o final da string e ajuda a evitar comparações complexas.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!