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.