2
respostas

Erro "Uncaught TypeError: Cannot set properties of undefined (setting 'onclick')"

Olá, boa noite.

Meu codigo esta dando esse erro e não esta fazendo o som ao clicar.

JavaScript

function tocaSomPom () { document.querySelector('#som_tecla_pom').play();

}

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

listaDeTeclas[0].onclick = tocaSomPom;

Html

<title>Alura MIDI</title>

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600&display=swap" rel="stylesheet">

<link rel="icon" type="image/png" href="images/bateria.png">
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/estilos.css">

<script src="main.js"></script>
<h1>Alura Midi</h1>

<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>

<script src="main.js"></script>
2 respostas

O Javascript parece estar certo:

function tocaSomPom () { 
    document.querySelector('#som_tecla_pom').play();
} 
// Você pega o som da tecla através do HTML e chama o método play

const listaDeTeclas = document.querySelectorAll('.tecla');
// pega todas as teclas que tenham a classe 'tecla'

listaDeTeclas[0].onclick = tocaSomPom;
// e por fim atribui a variável tocaSomPom ao evento de click

Como listaDeTeclas retornará um array, pedimos para observar o elemento de index 0, que seria a tecla_pom.

O que pode estar acontecendo é que há um script Javascript sendo importado no início de seu HTML, aí o código dispara um erro antes mesmo do click, pois sua página HTML ainda não foi montada e assim o script não conseguiu acessar as teclas no DOM. Se for isto faz o seguinte:

<link rel="icon" type="image/png" href="images/bateria.png">
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/estilos.css">

<script src="main.js"></script>
<!-- Tenta tirar este import do arquivo js no ínicio de sua página, e só deixa o que está no final -->

Talvez seja este o erro, perceba que há um mesmo arquivo sendo importado duas vezes, remova o que está no início do html.

Muito obrigado pela ajuda Gabriel!!