Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

234
Vistas
¿Cómo puedo escribir estos códigos js con for loop?

Tengo 3 botones y 3 contenidos. Cuando hago clic en cualquier botón, quiero mostrar el contenido de ese botón. Cuando hago clic en el otro botón, quiero mostrar el contenido de ese botón y eliminar el contenido del otro botón.

Me las arreglé para hacer esto con lógica simple, pero ¿cómo puedo hacerlo con un bucle for?

foto

 const content = document.querySelectorAll('.content'); const contentClose = document.querySelector('.close-content'); const btnsOpenContent = document.querySelectorAll('.show-content'); btnsOpenContent[0].addEventListener('click', function() { content[1].classList.remove('show-modal'); content[2].classList.remove('show-modal'); content[0].classList.add('show-modal'); } ) btnsOpenContent[1].addEventListener('click', function() { content[0].classList.remove('show-modal'); content[2].classList.remove('show-modal'); content[1].classList.add('show-modal'); } ) btnsOpenContent[2].addEventListener('click', function() { content[0].classList.remove('show-modal'); content[1].classList.remove('show-modal'); content[2].classList.add('show-modal'); } )
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Use bucles forEach simples junto con classList.toggle(className: string, force: boolean) :

 const content = document.querySelectorAll('.content'); const contentClose = document.querySelector('.close-content'); const btnsOpenContent = document.querySelectorAll('.show-content'); btnsOpenContent.forEach((btn, index) => { btn.addEventListener('click', () => { content.forEach((cnt, idx) => cnt.classList.toggle('show-modal', idx === index)) }) })
about 4 years ago · Juan Pablo Isaza Denunciar

0

Sugiero encarecidamente delegar , lo que significa que, en lugar de agregar un oyente a todos y cada uno de los botones, en su lugar se aprovecha el mecanismo burbujeante de los eventos, escuchando los clics en lugar de un solo elemento antecesor común de todos los botones. Luego, dentro del controlador de clics, implementa un protector que verifica si el clic realmente proviene de un botón.

Tenga en cuenta que agregué oculto a los dos últimos contenidos para comenzar con el contenido 1

También puede agregar activo al botón en el que se hizo clic y eliminarlo de los hermanos

NOTA: Este código no cambia sin importar cuántos botones, siempre que haya un número coincidente de divs de contenido.

También tenga en cuenta que no es necesario que una clase se muestre y se oculte

Por último, tenga en cuenta que también implementé su cierre

 const nav = document.getElementById("nav"); const contents = document.getElementById("contents"); const buttons = nav.querySelectorAll("#nav .show-content"); const contentDivs = contents.querySelectorAll("div.content") nav.addEventListener("click", e => { const tgt = e.target; // what was clicked? if (!tgt.matches(".show-content")) return; // not a button buttons.forEach((but,i) => contentDivs[i].hidden = but !== tgt); // hide if not the content that belongs to button }) contents.addEventListener("click", e => { const tgt = e.target; if (!tgt.matches(".close")) return; // not a button tgt.closest("div").hidden = true; // hide the div the close button is in })
 <div id="nav"> <button class="show-content">Show 1</button> <button class="show-content">Show 2</button> <button class="show-content">Show 3</button> </div> <div id="contents"> <div class="content">Content 1 <button class="close">X</button></div> <div class="content" hidden>Content 2 <button class="close">X</button></div> <div class="content" hidden>Content 3 <button class="close">X</button></div> </div>

about 4 years ago · Juan Pablo Isaza Denunciar

0

Lo más importante a tener en cuenta es que querySelectorAll no devuelve una matriz, sino una lista de nodos. ES6 ha introducido un método útil diseñado para este propósito exacto NodeList.prototype.forEach() .

Según mi experiencia, el enfoque más fácil para crear contenido con pestañas es agregar algún tipo de identificador para cada pestaña ".content" en el botón que activa el evento. el atributo "datos" se usa a menudo para esto, sin embargo, hay varias otras opciones.

Un ejemplo de su botón html usando el atributo de datos se vería así:

 <button class="show-content" data-content="content1">Show content 1</button> <button class="show-content" data-content="content2">Show content 2</button> <button class="show-content" data-content="content3">Show content 3</button>

Para esta técnica, su contenido HTML necesitaría una identificación que coincida con el identificador utilizado en sus botones:

 <div class="content" id="content1">Some content for 1</div> <div class="content" id="content2">Some content for 2</div> <div class="content" id="content3">Some content for 3</div>

Y el javascript correspondiente sería similar al siguiente:

 const btnsOpenContent = document.querySelectorAll('.show-content'); btnsOpenContent.forEach((button) => { button.addEventListener('click', (event) => { let contentId = event.target.getAttribute('data-content'); let targetContent = document.getElementById(contentId); // Hide all contents document.querySelectorAll('content').forEach((element) => { element.classList.remove('show-modal'); }) // Show selected content targetContent.classList.add('show-modal'); }); });

Este código puede incluso acortarse:

 const btnsOpenContent = document.querySelectorAll('.show-content'); btnsOpenContent.forEach((button) => { button.addEventListener('click', (event) => { let contentId = event.target.dataset.content; let targetContent = document.getElementById(contentId); document.querySelectorAll('content').forEach((element) => { element.classList.toggle('show-modal', contentId === element.id); }) }); });
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda