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

[Dúvida] Os comandos "-" e "+" do foquetes

Olá Pessoal, boa tarde!

Tudo bem?

No meu código só a parte do foquetes que não está funcionando!

const controle = document.querySelectorAll("[data-controle]");
const estatisticas = document.querySelectorAll("[data-estatistica]");
const pecas = {
    "bracos": {
        "forca": 29,
        "poder": 35,
        "energia": -21,
        "velocidade": -5
    },

    "blindagem": {
        "forca": 41,
        "poder": 20,
        "energia": 0,
        "velocidade": -20
    },
    "nucleos":{
        "forca": 0,
        "poder": 7,
        "energia": 48,
        "velocidade": -24
    },
    "pernas":{
        "forca": 27,
        "poder": 21,
        "energia": -32,
        "velocidade": 42
    },
    "foguetes":{
        "forca": 0,
        "poder": 28,
        "energia": 0,
        "velocidade": -2
    }
}

controle.forEach( (elemento) => {
    elemento.addEventListener("click", (evento) => {
        manipulaDados(evento.target.dataset.controle, evento.target.parentNode)
        atualizaEStatisticas(evento.target.dataset.peca)
    })
})

function manipulaDados(operacao, controle) {
    const peca = controle.querySelector("[data-contador]");
    
    if(operacao === "-") {
        peca.value = parseInt(peca.value) - 1;
    } else {
        peca.value = parseInt(peca.value) + 1;
    }
}

function atualizaEStatisticas(peca) {
    estatisticas.forEach( (elemento) => {
        elemento.textContent = parseInt(elemento.textContent) + pecas[peca][elemento.dataset.estatistica]
    })
}

Por gentileza, alguém pode me ajudar.

6 respostas

Olá Alan, tudo bem?

Fiz os teste utilizando o seu script e não obtive o erro mencionado seu código funcionou como esperado, quando se refere a foguete você diz que é a parte de estatísticas ou dos atributos ex, braços, blindagem, etc.

Para lhe auxiliar de forma mais assertiva você poderia por gentilizar enviar o seu código do arquivo HTML e um print do erro que faz referência a ''parte do foguete" desde modo consigo lhe fornecer uma melhor resposta para sanar a sua dúvida.

Fico no aguardo e a disposição para lhe auxiliar!

Sucesso

Um grande abraço e até mais!

Olá Victor, boa tarde!

Estou bem! Estimo que esteja tudo bem contigo.

A parte dos atributos:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" type="image/jpg" href="img/favicon.ico"/>
    <title>Robotron 2023</title>

    <link rel="stylesheet" href="css/style.css">
    <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=Teko:wght@300;500&display=swap" rel="stylesheet">
</head>
<body>
    <main>
        <section class="robotron">
            <img class="robo" src="img/robotron.png" alt="Robotron" id="robotron">
            <figcaption class="titulo">ROBOTRON <br>2023</figcaption>
        </section>

        <section class="box estatisticas">
            <div class="estatistica">
                <p class="estatistica-titulo">Força</p>
                <div class="estatistica-valor">
                    <p class="estatistica-numero" data-estatistica="forca">0</p>
                </div>
            </div>
            <div class="estatistica">
                <p class="estatistica-titulo">Poder</p>
                <div class="estatistica-valor">
                    <p class="estatistica-numero" data-estatistica="poder">0</p>
                </div>
            </div>
            <div class="estatistica">
                <p class="estatistica-titulo">Energia</p>
                <div class="estatistica-valor">
                    <p class="estatistica-numero" data-estatistica="energia">0</p>
                </div>
            </div>
            <div class="estatistica">
                <p class="estatistica-titulo">Velocidade</p>
                <div class="estatistica-valor">
                    <p class="estatistica-numero" data-estatistica="velocidade">0</p>
                </div>
            </div>
        </section>

Continua...

 <section class="equipamentos">
            <form action="" class="montador">
                <div class="box montador-conteudo">
                    <div class="peca">
                        <label for="" class="peca-titulo">Braços</label>
                        <div class="controle">
                            <buttom class="controle-ajuste" data-controle="-" data-peca="bracos">-</buttom>
                            <input type="text" class="controle-contador" value="00" data-contador>
                            <buttom class="controle-ajuste" data-controle="+" data-peca="bracos">+</buttom>
                        </div>
                    </div>
                    <hr class="linha">
                    <div class="peca">
                        <label for="" class="peca-titulo">Blindagem</label>
                        <div class="controle">
                            <buttom class="controle-ajuste" data-controle="-" data-peca="blindagem">-</buttom>
                            <input type="text" class="controle-contador" value="00" data-contador>
                            <buttom class="controle-ajuste" data-controle="+" data-peca="blindagem">+</buttom>
                        </div>
                    </div>
                    <hr class="linha">
                    <div class="peca">
                        <label for="" class="peca-titulo">Núcleos</label>
                        <div class="controle">
                            <buttom class="controle-ajuste" data-controle="-" data-peca="nucleos">-</buttom>
                            <input type="text" class="controle-contador" value="00" data-contador>
                            <buttom class="controle-ajuste" data-controle="+" data-peca="nucleos">+</buttom>
                        </div>
                    </div>
                    <hr class="linha">
                    <div class="peca">
                        <label for="" class="peca-titulo">Pernas</label>
                        <div class="controle">
                            <buttom class="controle-ajuste" data-controle="-" data-peca="pernas">-</buttom>
                            <input type="text" class="controle-contador" value="00" data-contador>
                            <buttom class="controle-ajuste" data-controle="+" data-peca="pernas">+</buttom>
                        </div>
                    </div>
                    <hr class="linha">
                    <div class="peca">
                        <label for="" class="peca-titulo">Foguetes</label>
                        <div class="controle">
                            <buttom class="controle-ajuste" data-controle="-" data-peca="foquetes">-</buttom>
                            <input type="text" class="controle-contador" value="00" data-contador>
                            <buttom class="controle-ajuste" data-controle="+" data-peca="foquetes">+</buttom>
                        </div>
                    </div>
                </div>
                <input type="submit" value="Iniciar produção" class="producao" id="producao">
            </form>
        </section>
    </main>
    <script src="./js/main.js"></script>
</body>
</html>

Obrigado!!!

Olá Alan, tudo bem?

Muito obrigado por compartilhar seu código, primeiramente devemos atualizar o seu HTML na parte dos foguetes, para o seguinte código:

    <div class="peca">
           <label for="" class="peca-titulo">Foguetes</label>
             <div class="controle">
                 <button class="controle-ajuste" data-controle="-" data-peca="foguetes">-</button>
                 <input type="text" class="controle-contador" value="00" data-contador>
                <button class="controle-ajuste" data-controle="+" data-peca="foguetes">+</button>
          </div>
   </div>

Devemos alterar o valor de data-peca="foquetes" para data-peca="foguetes", trocando a letra q pelo g.

fiz alguns teste e erro era que toda vez que eu clicava no mais(+) ou menos(-) do foguete ele atualizava a tela, para isso fiz algumas modificações:

  1. Adicionei um event listener para o evento "submit" no formulário com a classe "montador". Isso é feito utilizando formulario.addEventListener("submit", (evento) => {...});. Dessa forma, quando o formulário for submetido, o evento será capturado.

  2. No event listener do evento "submit", adicionei evento.preventDefault();. Isso evita o comportamento padrão de atualização da página ao submeter o formulário. Assim, a página não será recarregada desnecessariamente.

  3. Adicionei evento.preventDefault(); também nos event listeners dos botões de controle. Isso evita que o clique nos botões dispare o comportamento padrão, que é recarregar a página.

Com essas modificações, você evitará a atualização da página ao clicar nos botões de controle ou ao submeter o formulário. Dessa forma, você poderá interagir com os botões e ver as estatísticas sendo atualizadas sem a página ser recarregada.

Seu código completo fica assim:

const controle = document.querySelectorAll("[data-controle]");
const estatisticas = document.querySelectorAll("[data-estatistica]");
const pecas = {
    "bracos": {
        "forca": 29,
        "poder": 35,
        "energia": -21,
        "velocidade": -5
    },

    "blindagem": {
        "forca": 41,
        "poder": 20,
        "energia": 0,
        "velocidade": -20
    },
    "nucleos": {
        "forca": 0,
        "poder": 7,
        "energia": 48,
        "velocidade": -24
    },
    "pernas": {
        "forca": 27,
        "poder": 21,
        "energia": -32,
        "velocidade": 42
    },
    "foguetes": {
        "forca": 0,
        "poder": 28,
        "energia": 0,
        "velocidade": -2
    }
};

const formulario = document.querySelector(".montador");

formulario.addEventListener("submit", (evento) => {
    evento.preventDefault();
});

controle.forEach((elemento) => {
    elemento.addEventListener("click", (evento) => {
        evento.preventDefault();
        manipulaDados(evento.target.dataset.controle, evento.target.parentNode);
        atualizaEStatisticas(evento.target.dataset.peca);
    });
});

function manipulaDados(operacao, controle) {
    const peca = controle.querySelector("[data-contador]");

    if (operacao === "-") {
        peca.value = parseInt(peca.value) - 1;
    } else {
        peca.value = parseInt(peca.value) + 1;
    }
}

function atualizaEStatisticas(peca) {
    estatisticas.forEach((elemento) => {
        elemento.textContent = parseInt(elemento.textContent) + pecas[peca][elemento.dataset.estatistica];
    });
}

Espero ter ajudado, qualquer dúvida, me coloco à disposição! Bons estudos!

Sucesso

Um grande abraço e até mais!

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

Olá Victor, boa tarde!

Estou bem!

Estimo que esteja tudo bem, contigo e a sua família.

Um simples detalhe no código faz toda diferença.

Agora deu certo!

Obrigado!!!