Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

219
Visualizações
Solo el último elemento que agregué usando innerHTML mantiene sus controladores de eventos, ¿por qué?

Estoy tratando de crear un script que inyecte información de objetos interactuables en una lista de la página de marcado. Cada vez que trato de agregar un evento onclick en un div, funciona bien, sin embargo, cada vez que intento agregar más dentro de un bucle for, no funciona de la manera que pretendía.

Eché un vistazo a lo que sucede con los puntos de interrupción en el depurador de la página web y veo que el problema es que parece eliminar el evento en el div anterior antes de agregarlo al siguiente div. Al final, el único evento que queda es el último div después de que finaliza el ciclo.

Quiero mantener estos eventos en todos mis divs, no solo en el último... ¿cuál parece ser el problema aquí?

 var objects = ['Tom', 'Sauna', 'Traum']; for (var i = 0; i < objects.length; i++){ document.getElementById('list').innerHTML += "<div class='item' id='"+ i +"'>" + objects[i] + "</div>"; document.getElementById(i).addEventListener("mouseup", function() { Select(this); }); } function Select(char) { console.log(char); }
 div.item { border: 1px solid black; padding: 4px; margin: 4px; }
 <div id="list"></div>

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Cuando cambias, el navegador innerHTML reconstruye el contenido del elemento, eliminando todos los controladores de eventos adjuntos. Utilice métodos DOM en su lugar:

 for (let i = 0; i < objects.length; i++){ var block = document.createElement('div'); block.setAttribute('id', i); document.getElementById('list').appendChild( block ); block.addEventListener("mouseup", function() { Select(this); }); }

UPD: alternativamente use un método insertAdjacentHTML en lugar de redefinir innerHTML :

 document.getElementById('list').insertAdjacentHTML( 'beforeend', "<div id='"+ i +"'>" + i + "</div>");
about 4 years ago · Juan Pablo Isaza Relatório

0

La razón es la forma en que está agregando. innerHtml += sobrescribe efectivamente el contenido existente en la lista. Por lo tanto, todos los elementos que agregó y vinculó simplemente desaparecen y se agregan nuevos elementos cada vez.

Hay un par de maneras de hacer que esto funcione.

Primero, en lugar de asignar un HTML interno, puede agregar elementos.

 const items = ['taco', 'apple', 'pork']; const list = document.getElementById("list"); for (const item of items) { const el = document.createElement("div"); el.addEventListener('click', (e) => console.log(`clicked ${item}`)); el.innerText = item; list.appendChild(el); }
 <div id="list"></div>

Dado que estamos agregando un elemento explícito y no sobrescribiendo el contenido, esto funcionará.

Un mejor enfoque sería utilizar la delegación . Asignamos un solo controlador de eventos a la lista y escuchamos cualquier clic. Luego averiguamos en qué elemento específico se hizo clic.

 const items = ['taco', 'apple', 'pork']; const list = document.getElementById("list"); const add = document.getElementById("add"); list.addEventListener('click', (e) => { const parent = e.target.closest("[data-item]"); if (parent != null) { console.log(`clicked on ${parent.dataset['item']}`); } }); for (const item of items) { list.innerHTML += `<div data-item="${item}">${item}</div>`; } add.addEventListener('click', () => { const item = `item ${Date.now()}`; list.innerHTML += `<div data-item="${item}">${item}</div>`; })
 <div id="list"></div> <button id="add">add</button>

La magia aquí es que asignamos un solo controlador de eventos en el padre y usamos el closest para averiguar en qué elemento se hizo clic. Estoy usando innerHTML aquí por simplicidad, pero debe evitarse por razones de seguridad .

about 4 years ago · Juan Pablo Isaza Relatório

0

Un buen patrón para usar cuando sea apropiado es la delegación de eventos . Permite seguir el principio Don't Repeat Yourself, lo que facilita considerablemente el mantenimiento del código y, potencialmente, hace que los scripts se ejecuten significativamente más rápido. Y en su caso, evita los escollos de que un elemento se encargue de modificar su propio contenido.

Por ejemplo:

 const container = document.getElementById('container'); container.addEventListener("click", toggleColor); // Events bubble up to ancestors function toggleColor(event) { // Listeners automatically can access triggering events const clickedThing = event.target; // Event object has useful properties if(clickedThing.classList.contains("click-me")){ // Ensures this click interests us clickedThing.classList.toggle("blue"); } }
 .click-me{ margin: 1em 1.5em; padding 1em 1.5em; } .blue{ color: blue; }
 <div id="container"> <div id="firstDiv" class="click-me">First Div</div> <div id="firstDiv" class="click-me">Second Div</div> </div>

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda