Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Ocorre erro ao apertar os botões

olá, fiz os códigos igual aos das vídeos-aulas, porém ao tentar clicar em qualquer um dos botões nada acontece e aparece um erro no console.

app.js:

function alterarStatus(id) {
    let gameClicado = document.getElementById(`game-${id}`);
    let imagem = gameClicado.querySelector('.dashboard__items__img');
    let botao = gameClicado.querySelector('.dashboard__item__button');

    if(imagem.classList.contains('dashboard__item__img--rented')) {
        imagem.classList.remove('dashboard__item__img--rented');
        botao.innerHTML = 'Alugar';
        botao.classList.remove('dashboard__item__button--return');
    } else {
        imagem.classList.add('dashboard__item__img--rented');
        botao.innerHTML = 'Devolver';
        botao.classList.add('dashboard__item__button--return');
    }
}

index.html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AluGames</title>
    <link rel="stylesheet" href="css/main.css">
</head>

<body class="body">
    <main class="container main">
        <img src="img/logo.svg" alt="Logo AluGames">
        <section class="divisor">
            <div class="divisor__line"></div>
            <img src="img/fade_bar.svg" alt="Visual bar" class="divisor__bar">
            <div class="divisor__line"></div>
        </section>
        <h1 class="page-title">Aluguel de <span class="page-title__emphasis">boardgames</span></h1>
        <section class="dashboard">
            <ul class="dashboard__items">
                <li class="dashboard__items__item" id="game-1">
                    <div class="dashboard__item__img">
                        <img src="img/monopoly.png" alt="Capa jogo Monopoly">
                    </div>
                    <p class="dashboard__item__name">Monopoly</p>
                    <a onclick="alterarStatus(1)" href="#" class="dashboard__item__button">Alugar</a>
                </li>
                <li class="dashboard__items__item" id="game-2">
                    <div class="dashboard__item__img">
                        <img src="img/ticket_to_ride.png" alt="Capa jogo Ticket to Ride">
                    </div>
                    <p class="dashboard__item__name">Ticket to Ride</p>
                    <a onclick="alterarStatus(2)" href="#" class="dashboard__item__button">Alugar</a>
                </li>
                <li class="dashboard__items__item" id="game-3">
                    <div class="dashboard__item__img dashboard__item__img--rented">
                        <img src="img/takenoko.png" alt="Capa jogo Takenoko">
                    </div>
                    <p class="dashboard__item__name">Takenoko</p>
                    <a onclick="alterarStatus(3)" href="#" class="dashboard__item__button dashboard__item__button--return">Devolver</a>
                </li>
            </ul>
        </section>
        <img src="img/hachuras.svg" alt="Visual hachuras" class="hachuras">
    </main>

    <script src="js/app.js"></script>
</body>

</html>

O erro mostrado no console ao clicar nos botões é o seguinte:

app.js:6 Uncaught TypeError: Cannot read properties of null (reading 'classList')
    at alterarStatus (app.js:6:15)
    at HTMLAnchorElement.onclick (VM875 index.html:1:1)

Tentei de tudo, mas nada deu certo, gostaria de saber se houve algum erro no código ou é algum outro problema, agradeço desde já.

2 respostas

Olá amigo :)

Analisei um pouco seu código e talvez possa ajudar.

Se você olhar para o seu HTML, verá que a classe dashboard__items__img e dashboard__item__button estão dentro de um item de lista (li) com o id="game-1", id="game-2", ou id="game-3". No entanto, o JavaScript pode não estar conseguindo encontrar os elementos corretamente, provavelmente devido ao fato de o método querySelector não estar encontrando os elementos esperados. Vou sugerir um ponto que pode não resolver de fato, mas irá ajudar a entender melhor o erro e o fluxo do codigo:

Garanta que o item com id="game-{id}" realmente exista, utilizando verificação simples com if() logo após pegar o gameClicado. Caso contrário, a função deve retornar algo antes de tentar acessar os elementos dentro dele. Adicione alguns console.log() se necessário para ajudar a entender o fluxo na função. Outra coisa seria o "botão" que chama a função ser uma tag , o que pode estar gerando um refresh na página e conflitando com a execução da função. Para resolver esta questão você pode testar com outra tag. Caso seja este o problema e queira ainda manter a tag , pesquise sobre o preventDefault() e implemente ele na sua função que vai anular o comportamento.

Espero ter ajudado e bons estudos !

solução!

Oi Davi

Verifique o erro:

Na linha 6 do app.js vc está tentando ler a propriedade de um elemento null (nulo)

'imagem' é o elemento que não existe

    let imagem = gameClicado.querySelector('.dashboard__items__img');

Verifique que vc colocou um 's' a mais em 'item', então o valor de imagem ficou null

tux matrix    Caso este post o tenha ajudado, por favor, marcar como solucionado ☑️. Bons Estudos! 🤓