1
resposta

Dúvida ao adicionar classe pelo javaScript

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

const teclas = document.querySelectorAll('.tecla');

let i = 0;

while(i<teclas.length){

    const sons = teclas[i].classList[1];
    teclas[i].onclick = function(){
    tocaSom(`#som_${sons}`);
}

    teclas[i].onkeydown = function (){
    teclas[i].classList.add('ativa');
}
    i++;
}

Não entendi porque o código acima não funciona. Se eu atribuir o teclas[i] a uma constante, e no lugar do teclas[i] colocar a constante, aí sim funciona. Veja no código abaixo:

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

const teclas = document.querySelectorAll('.tecla');

let i = 0;

while(i<teclas.length){

    const listaDeTeclas = teclas[i];
    const sons = listaDeTeclas.classList[1];

    listaDeTeclas.onclick = function(){
    tocaSom(`#som_${sons}`);
}

    listaDeTeclas.onkeydown = function (){
    listaDeTeclas.classList.add('ativa');
}
    i++;
}

Por que isso acontece?

1 resposta

Oii, Dev! Tudo bem por aí?

Agradeço por aguardar o nosso retorno.

O código não funciona na primeira versão porque dentro da função onkeydown, o teclas[i] não está se referindo a uma constante, mas sim a um elemento da lista de teclas. Como a lista de teclas está sendo percorrida dentro de um loop ( while), o valor de i está mudando a cada iteração, e isso pode causar problemas de referência. E No segundo código, você cria uma constante listaDeTeclas que armazena o elemento da lista de teclas, e isso resolve o problema de referência.

Espero ter ajudado!

Qualquer dúvida estarei à disposição para te ajudar.

Bons estudos e a gente se vê!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!