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

Erro ao adicionar classList.add

Boa noite. Estou tentando configurar um efeito na minha página com JavaScript mas de alguma forma não esta dando certo (e não sei por quê).

O HTML

              <div class="coluna-principal">
                    <div class="conteudo-formacao" data-hover="classOverlay">
                        <div class="conteudo-formacao__imagem">asd</div>
                        <span class="conteudo-formacao__legenda">asdasd</span>
                    </div>
                </div>
                <div class="coluna-principal">
                    <div class="conteudo-formacao" data-hover="classOverlay">
                        <div class="conteudo-formacao__imagem">asd</div>
                        <span class="conteudo-formacao__legenda">asdasd</span>
                    </div>
                </div>

O JavaScript que tentei fazer

const conteudoFormacao = document.querySelectorAll('[data-hover]');

conteudoFormacao.addEventListener("mouseover", addClassOverlay());
conteudoFormacao.addEventListener("mouseout", removeClassOverlay());

function addClassOverlay(){
    conteudoFormacao.classList.add("conteudo-formacao--overlay");
}

function removeClassOverlay(){
    conteudoFormacao.classList.remove("conteudo-formacao--overlay");
}

Quero que este efeito do evento faça algo similar ao hover do CSS. Após eu ter este código funcionando eu o colocarei dentro de outro código que identifica o tamanho da tela do dispositivo (parecido com o media-querie) do CSS.

Mas quero fazer isto tudo em JS para treinar hehehe

Abraços

4 respostas

Bom dia, André. Tudo bem?

Cara, o document.querySelectorAll retorna uma lista de elementos e não um elemento propriamente dito.

Logo o conteudoFormacao é um array e não é possível adicionar um eventListener em um array.

Se você quer adicionar o mesmo eventListener para todos os elementos deste array, vai precisar fazer um loop nos elementos e adicioná-lo.

Exemplo:

const conteudoFormacao = document.querySelectorAll('[data-hover]');

 conteudoFormacao.forEach(element => {
     element.addEventListener('mouseover', () => element.classList.add("conteudo-formacao--overlay"));
     element.addEventListener('mouseout', () => element.classList.remove("conteudo-formacao--overlay"));
 });

Espero ter ajudado. Bons estudos! =)

Amigo funcionou demais! Gostaria só de saber o que este elemento element representa :D Ele leva uma arrow function e nos parâmetros do eventListener tb, como posso refatorar e dividir este código para as funções não serem em arrow function eu poder nomeá-las

solução!

E aí André, beleza?

Fico feliz por ter ajudado! :)

Eu usei o element como parâmetro para poder acessar os itens de conteudoFormacao, então ele é uma especie de variável que guarda cada item do meu array conteudoFormacao.

Eu consegui o mesmo efeito sem usar arrow functions desse jeito:


const conteudoFormacao = document.querySelectorAll('[data-hover]');

conteudoFormacao.forEach(addClassOverlay);
conteudoFormacao.forEach(removeClassOverlay);

function addClassOverlay(element) {
    element.addEventListener('mouseover', function () {
        element.classList.add("conteudo-formacao--overlay")
    });
}

function removeClassOverlay(element) {
    element.addEventListener('mouseout', function () {
        element.classList.remove("conteudo-formacao--overlay")
    });
}

Faço 2 forEach, um chamando o addClassOverlay e outro chamando removeClassOverlay e dentro dessas funções eu passo o addEventListener chamando outra funcção responsável por adicionar ou remover a classe.

Espero ter ajudado. =)

Bons estudos!

Tu é brabo demais chefe! Valeu dms, entendi total :D