2
respostas

[Dúvida] Relação classList e botão

Não entendi como parte do código em que a prof. declara a var const instrumento = tecla.classList[1]; consegue identificar o som certo para executar, sendo que foi informado o valor 1 na array

2 respostas

Olá, Mayra! Tudo bem?

Bom, vamos por partes:

A função tocaSom() é a responsável por identificar o elemento de áudio na DOM (através do ID informado) e iniciar a execução do áudio por meio do método play() conforme o trecho de código abaixo:

function tocaSom(idElementoAudio) {
    document.querySelector(idElementoAudio).play();
}

Por sua vez, na interface temos vários elementos que representam as teclas que acionarão o áudio correspondente. Estes elementos (as teclas) possuem uma classe CSS chamada "tecla" atribuída a eles e é por meio dessa classe que obtemos a lista de todos os elementos que representam teclas na nossa interface. Essa lista armazenada na constante listaDeTeclas conforme o código abaixo:

const listaDeTeclas = document.querySelectorAll(".tecla");

Em seguida, a professora usa um loop while para percorrer a lista de teclas que obtemos com o código anterior e pega cada um dos elementos presentes nessa lista (ou seja, cada <button> que representa uma tecla na interface da nossa aplicação) e armazena na constante tecla. Ou seja, a constante tecla representa (a cada volta do loop) um dos elementos <button> presentes na constante listaDeTeclas:

const tecla = listaDeTeclas[contador]

Agora temos o seguinte. Se olharmos a estrutura HTML cada um dos <button> que representa uma tecla na interface, possui duas classes: "tecla" e uma adicional que pode ser "tecla_pom", "tecla_puff", "tecla_splash" etc.

Continuando, observe o código abaixo:

const instrumento = tecla.classList[1];

A propriedade classList retorna uma lista com as classes CSS atribuídas a um elemento. No caso dos botões que representam as teclas, classList sempre retornará um array com dois valores: o primeiro (posição 0) com o valor "tecla" e o segundo (posição 1) com a classe CSS adicional ("tecla_pom", "tecla_splash", "tecla_tim" etc.).

Como o valor que está sendo atribuído à constrante instrumento é o valor presente na segunda posição do classList, o valor que está sendo armazenado nessa constante é esse da classe CSS adicional ("tecla_pom", "tecla_tim", "tecla_splash" etc.).

Em seguida, é adicionado o evento click em cada elemento tecla encontrado na interface que ao ser clicado executa a função tocaSom() passando o ID do elemento de audio que deve ser executado (lembra lá no início que a função tocaSom recebe o ID do elemento de áudio e com isso identifica esse elemento na DOM e chama o método play() desse objeto?)

Cada um dos elementos de áudio (tag <audio>) no HTML possui um ID que segue o padrão: som_(classe adicional da tecla de ativação). Exemplo:

  • som_tecla_pom
  • som_tecla_splash
  • som_tecla_tim
  • som_tecla_plim E assim por diante...

Percebendo esse padrão, a professora então monta o ID do elemento que deve ser tocado usando a concatenação dos textos "#som_" e a classe CSS adicional da tecla atualmente referenciada no loop (que está armazenada na constante instrumento).

Sendo assim, em uma rodada do loop while o valor da constante instrumento pode ser tecla_pom e, por sua vez, no evento click associado a essa tecla o valor existente na função callback a ser passado como argumento para a função tocaSom é #som_ + tecla_pom que vai resultar em: tocaSom("#som_tecla_pom") representado pelo trecho abaixo:

tecla.onclick = function() {
    // #som_${instrumento} resulta em "#som_tecla_pom", "#som_tecla_splash", "#som_tecla_tom" e assim por diante a cada virada do loop
    tocaSom(`#som_${instrumento}`);
}

Logo, a cada virada do loop um novo ID está sendo gerado com base em cada concatenação que, por sua vez, serve de seletor para identificar cada um dos elementos de audio existente no HTML que possua esses IDs.

Assim, quando uma tecla específica for clicada, o JavaScript já terá em memória o evento click associado a essa tecla e qual elemento <audio> ela deverá acionar através do ID gerado pela concatenação e fornecido como parâmetro para a função tocaSom que encontra esse elemento e dá play nele.

Entendeu?

Tentei ser bem detalhado na explicação e espero que tenha ficado claro (e não mais confuso... rs).

Caso ainda reste alguma dúvida, só postar aí que a gente vai ajudando e eu tento usar uma outra abordagem para explicar se necessário.

Att.

Olá @Jhonatan, também estou com a mesma duvida.. a lógica da programação eu entendi, o problema é quando chega justamente aqui:

const instrumento = tecla.classList[1];

Aqui seria como se escrevêssemos:

const instrumento = listaDeTeclas[contador].classList[1];

Correto?

A minha duvida é: Como a classList identifica qual "valor está sendo solicitado", pois a listaDeTeclas está atribuída ao contador, logo ele retorna o valor correto, já a classList recebe esse valor como? Ela também usa o valor que o contador recebe para que dentro dos colchetes [ ] seja o mesmo valor retornado pelo contador?

Acho que não ficou confuso a duvida rsrsrsrs Muito obrigado!!!!