Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

204
Views
Evento jQuery activado varias veces

He clonado divs que contienen botones que clonan a sus padres. Al intentar hacer clic en los botones, los eventos se activan 2n veces, de modo que al hacer clic en el segundo clon se producen otros 4 clones, y así sucesivamente:

 $(".add").off("click").on("click", function(e) { e.stopPropagation(); e.stopImmediatePropagation(); $(".cloneable").clone(true).appendTo(".container"); }); $(".rem").off("click").on("click", function() { if (document.getElementsByClassName('container')[0].childElementCount > 1) { $(".cloneable:last").remove(); } });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="container"> <div class="cloneable"> <div> <a class="btn btn-primary add" role="button">Add cell</a> <a class="btn btn-primary rem" role="button">Remove cell</a> </div> <iframe src="index.php"></iframe> </div> </div>
¿Qué podría estar haciendo mal?

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Unas pocas cosas.

  1. Es más fácil usar un controlador de clic diferido.
  2. Estabas clonando todo lo 'clonable', no solo el first . jQuery encontrará todos los cloneable y los clonará, no solo su original.
  3. Eliminar ahora elimina el que hizo clic, no el último.
  4. La clase disabled se agregará/eliminará al botón rem , dependiendo de si solo queda una o no.

 $(".container").on("click", ".add", function(e) { e.stopPropagation(); e.stopImmediatePropagation(); $(".container .rem").removeClass("disabled"); let $cloneable = $(".cloneable").first().clone(true); $cloneable.appendTo(".container"); }).on("click", ".rem", function() { if($(this).hasClass("disabled") ) return; $(this).closest(".cloneable").remove(); if($(".container .rem").length === 1) $(".container .rem").addClass("disabled"); });
 .btn.btn-primary { background:#d5d5d5;padding:4px;cursor:pointer; } .btn.btn-primary.disabled { background:red; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="container"> <div class="cloneable"> <div> <a class="btn btn-primary add" role="button">Add cell</a> <a class="btn btn-primary disabled rem" role="button">Remove cell</a> </div> <iframe src="trial37.php"></iframe> </div> </div>

about 4 years ago · Santiago Trujillo Report

0

 $(".add").on("click", function(e) { $(this).parent(".cloneable").clone(true).appendTo(".container"); });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="container"> <div class="cloneable"> <a class="btn btn-primary add" role="button">Add cell</a> <div>CONTENT</div> </div> </div>

Entonces, lo que sucede en su método es que está realizando una nueva consulta cada vez que hace clic y devuelve todos los elementos .clonable y luego los clona. Lo que desea es encontrar solo el elemento relevante para el elemento en el que hizo clic, por lo que desea comenzar con $(this) , que es el elemento en el que se hizo clic, y luego puede usar el método parent() para subir el árbol DOM en busca de el seleccionador

En este tipo de situaciones, puede ayudar poner un debugger; dentro de su evento de clic y luego ejecute el método uno a la vez. Como $('.clonable') . Luego puede ver que tal vez se hace más grande cada vez y que apuntan a todos los elementos existentes.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!