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

232
Vistas
Vanilla Javascript: ¿Cómo agregar múltiples detectores de eventos a los botones que se crean dinámicamente con la misma clase en django?

Actualmente estoy trabajando en un proyecto 4 para CS50w - Red. Una de las tareas es agregar un botón de edición de publicaciones (para editar las publicaciones que creó el usuario que inició sesión (solo el propietario)), que hace esto asíncrono. Dado que para almacenar publicaciones estoy usando Django Models, estoy usando Django (y sus capacidades de plantilla) para mostrar todas las publicaciones a los usuarios también, y un botón de edición (si el usuario también es el creador de la publicación). Estoy mostrando todas las publicaciones en un div. Esto significa que el botón para editar también es parte de este div... lo que significa que solo puedo darle una sola clase o id para hacer referencia, pero no sé cómo distinguirlos y cómo saber cuál. (desde qué publicación) se hace clic para que pueda editar esa publicación y no la primera en la que aparece el JS en DOM ... De todos modos, aquí está el código:

HTML en Django:

 {% for post in posts %} <div class="post"> <a href="{% url 'users' post.user.username %}">{{ post.user }}</a> <p>{{ post.content }}</p> <p>{{ post.created }}</p> {% if user.is_authenticated and user == post.user %} <button class="edit_post_button">Edit Post</button> {% endif %} </div> <div class="edit_post" style="display: none;"> <a href="{% url 'users' post.user.username %}">{{ post.user }}</a> <textarea rows=3 cols=20>{{ post.content }}</textarea> <p>{{ post.created }}</p> <button class="save_edit_post_button">Save</button> </div> {% endfor %}

y aquí está el pequeño JS que escribí que no funciona (estoy empezando a aprenderlo y me gustaría terminar este proyecto con vainilla JS):

 document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.edit_post_button').forEach(edit_post_button => { edit_post_button.addEventListener('click', edit_post); }) }); function edit_post(event) { document.querySelector('.post').style.display = 'none'; document.querySelector('edit_post').style.display = 'block'; }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

La delegación es la respuesta

Tenga en cuenta que olvidó un punto en document.querySelector('edit_post')

 window.addEventListener('load', function() { document.getElementById('postContainer').addEventListener('click', function(e) { const tgt = e.target.closest('.edit_post_button') if (tgt) { const postDiv = tgt.closest('.postDiv') postDiv.querySelector('.post').hidden = true postDiv.querySelector('.edit_post').hidden = false console.log(tgt.dataset.id); // if needed } }) })
 <div id="postContainer"> <div class="postDiv"> <div class="post"> <a href="User1URL">user 1</a> <p>Post 1 </p> <p>yesterday</p> <button class="edit_post_button" data-id="postId1">Edit Post</button> </div> <div class="edit_post" hidden> <a href="User1URL">user 1</a> <textarea rows=3 cols=20>Post 1</textarea> <p>Yesterday</p> <button class="save_edit_post_button">Save</button> </div> </div> <div class="postDiv"> <div class="post"> <a href="User2URL">user 2</a> <p>Post 2 </p> <p>yesterday</p> <button class="edit_post_button" data-id="postId2">Edit Post</button> </div> <div class="edit_post" hidden> <a href="User2URL">user 2</a> <textarea rows=3 cols=20>Post 2</textarea> <p>Yesterday</p> <button class="save_edit_post_button">Save</button> </div> </div> </div>

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