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

TypeError: icon.addEventListener is not a function

Não sei onde errei em relação a isso

HTML


<body>
  <main id="container">
    <div class="container__title">
      <img src="./assets/images/icon-star.svg" alt="">
      <h1>FAQs</h1>
    </div>

    <section class="container__informacoes">
      <div class="container__informacoes__ask">
        <h3>What is help me?</h3>  
        <img class="icon-minmax icon__one" src="./assets/images/icon-minus.svg" alt="">
     </div>
      <p  class="container__informacoes__info">Fis simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled </p>
    </section>

    <section class="container__informacoes">
      <div class="container__informacoes__ask">
        <h3>is simply dummy </h3>
        <img class="icon-minmax icon__two"  src="./assets/images/icon-minus.svg" alt="">
     </div>
     <p  class="container__informacoes__info">is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled .</p>
       
    </section>

    <section class="container__informacoes">
      <div class="container__informacoes__ask">
        <h3>isimply dummy text </h3>
        <img class="icon-minmax icon__three"  src="./assets/images/icon-minus.svg" alt="">
      </div>
      <p class="container__informacoes__info">is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled </p>
    </section>

    <section class="container__informacoes">
      <div class="container__informacoes__ask">
        <h3>How can I get help?</h3>
        <img class="icon-minmax icon__four"  src="./assets/images/icon-minus.svg" alt="">
      </div>
      <p  class="container__informacoes__info">
         is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled 
      </p>
          
    </section>
  </main>

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

</body>

JS


const icon = document.querySelectorAll('.icon-minmax');

for(let i = 0; i < icon.length; i++) {
    const iconElement = icon[i];
    const iconElementClass = iconElement.classList[1];
    const classElement = `info__${iconElementClass}`;

    icon.addEventListener('click', () => {
        classElement.setAttribute('src','./assets/images/icon-minus.svg');

    });
        
}
5 respostas

Oi Geovana, tudo bem?

O erro TypeError: icon.addEventListener is not a function ocorre porque você está tentando adicionar um event listener diretamente a icon, que é uma NodeList retornada pelo document.querySelectorAll(). Para adicionar um event listener a cada elemento dessa lista, você precisa fazer isso individualmente para cada elemento dentro do loop. Além disso, há um pequeno erro ao acessar a classe do elemento. Vamos corrigir o código:

const icon = document.querySelectorAll('.icon-minmax');

for (let i = 0; i < icon.length; i++) {
    const iconElement = icon[i];
    const iconElementClass = iconElement.classList[1];
    const classElement = document.querySelector(`.info__${iconElementClass}`); // Corrigido aqui

    iconElement.addEventListener('click', () => {
        classElement.setAttribute('src', './assets/images/icon-minus.svg');
    });
}

Aqui estão as correções:

  1. A variável classElement foi corrigida para usar document.querySelector() para selecionar o elemento correto com a classe info${iconElementClass}.
  2. O evento click foi adicionado ao iconElement (cada ícone individual) usando iconElement.addEventListener('click', () => {...}).

agora apareceu outro erro : TypeError: classElement is null, pq classElement retorna null??

Oi Geovana, tudo bem?

Isso acontece porque classElement tenta buscar um elemento com document.querySelector(.info${iconElementClass}), mas o seu HTML não tem nenhum elemento com essa classe. Talvez o correto seja remover a string info, resultando em:

document.querySelector(.${iconElementClass})

Mas esse código parece estar redundante. Pelo que entendi do seu código, classElement será igual ao elemento iconElement. Tente usar a variável iconElement, resultando em:

iconElement.setAttribute('src', './assets/images/icon-minus.svg');

Se ainda não resolver o seu problema, especifique em qual resultado você gostaria de chegar, por favor.

Eu estava tentando mudar a imagem ao clicar, ajeitei essa mas surgiu outro : Uncaught TypeError: Cannot set properties of undefined (setting 'display') pq ta dando esse erro?? tenho que fazer outro for pra percorrer ??


const icon = document.querySelectorAll('.icon-minmax');
const information = document.querySelectorAll('.container__informacoes__info');


for (let i = 0; i < icon.length; i++) {
    const iconElement = icon[i];
    const iconElementClass = iconElement.classList[1];
    const classElement = document.querySelector(`.${iconElementClass}`);

    iconElement.addEventListener('click',() => {
        let iconMinus = classElement.getAttribute('src');
        let scrIcon = './assets/images/icon-minus.svg';

        if(iconMinus == scrIcon){
           classElement.setAttribute('src', './assets/images/icon-plus.svg');
           information.style.display = 'block';
        }else{
            classElement.setAttribute('src', './assets/images/icon-minus.svg');
            information.style.display = 'none';
        }
    });

    
}
solução!

Entendi! Então, você quer alterar o próprio ícone. As variáveis classElement e iconElementClass não são úteis nesse cenário. Você já tem o elemento do icon, que é o iconElement.

Troque para isso:

let currentIcon = iconElement.getAttribute('src');
let srcIconMinus = './assets/images/icon-minus.svg';
        
if (currentIcon === srcIconMinus){
  iconElement.setAttribute('src', './assets/images/icon-plus.svg');
  information[i].style.display = 'block';
} else {
  iconElement.setAttribute('src', './assets/images/icon-minus.svg');
  information[i].style.display = 'none';
}