Jquery-Klickereignis funktioniert nach der Append-Methode nicht


81

Ich habe also diese Schaltfläche, die der Tabelle eine neue Zeile hinzufügt. Mein Problem ist jedoch, dass .new_participant_formdas Klickereignis nach dem Anhängen nicht mehr abgehört wird.

http://jsfiddle.net/cTEFG/

Klicken Sie auf Neuen Eintrag hinzufügen und dann auf den Formularnamen.

$('#add_new_participant').click(function() {


    var first_name = $('#f_name_participant').val();
    var last_name = $('#l_name_participant').val();
    var role = $('#new_participant_role option:selected').text();
    var email = $('#email_participant').val();


    $('#registered_participants').append('<tr><td><a href="#" class="new_participant_form">Participant Registration</a></td><td>'+first_name+ ' '+last_name+'</td><td>'+role+'</td><td>0% done</td></tr>');

    });

    $('.new_participant_form').click(function() {

        var $td = $(this).closest('tr').children('td');

        var part_name = $td.eq(1).text();
        alert(part_name);

    });
});

HTML

<table id="registered_participants" class="tablesorter">

<thead>
<tr> 
<th>Form</th>
<th>Name</th>
<th>Role</th>
<th>Progress </th>


</tr> 
</thead>


<tbody>
<tr> 
<td><a href="#" class="new_participant_form">Participant Registration</a></td>
<td>Smith Johnson</td>
<td>Parent</td>
<td>60% done</td>


</tr> 
</tbody>

</table>

<button id="add_new_participant"></span>Add New Entry</button> 

Das Problem ist, dass das Ereignis nur an das new_participant_formElement angehängt wird, das sich bereits im Dokument befindet. Damit es auch für Elemente funktioniert, die Sie später hinzufügen, können Sie die Ereignisdelegierung verwenden, wie dystroy gezeigt hat, oder den Handler an jeden Anker anhängen, bevor Sie ihn einfügen (ersterer ist effizienter).
Asad Saeeduddin

Antworten:


204

Verwendung auf :

$('#registered_participants').on('click', '.new_participant_form', function() {

Damit wird der Klick an ein beliebiges Element in #registered_participantsder Klasse delegiert new_participant_form, auch wenn er hinzugefügt wird, nachdem Sie den Ereignishandler gebunden haben.


4
Gibt es einen Nachteil in Bezug auf die Leistung, wenn Sie verwenden $(document).on('click', '.new_participant_form', function() {});?
basZero

3
@basZero Es gibt einen, da jQuery dann alle Klicks verarbeiten müsste und nicht nur den auf dem, #registered_participantsaber um fair zu sein, ist diese Verlangsamung so gering, dass sie irrelevant ist. Es ist meistens besser, das richtige Element zu finden, weil es sauberer ist.
Denys Séguret

34

Die .on()Methode wird verwendet, um Ereignisse an Elemente zu delegieren, die dynamisch hinzugefügt wurden oder bereits im DOM vorhanden sind:

// STATIC-PARENT              on  EVENT    DYNAMIC-CHILD
$('#registered_participants').on('click', '.new_participant_form', function() {

  var $td = $(this).closest('tr').find('td');
  var part_name = $td.eq(1).text();
  console.log( part_name );

});


$('#add_new_participant').click(function() {

  var first_name = $.trim( $('#f_name_participant').val() );
  var last_name  = $.trim( $('#l_name_participant').val() );
  var role       = $('#new_participant_role').val();
  var email      = $('#email_participant').val();
  
  if(!first_name && !last_name) return;

  $('#registered_participants').append('<tr><td><a href="#" class="new_participant_form">Participant Registration</a></td><td>' + first_name + ' ' + last_name + '</td><td>' + role + '</td><td>0% done</td></tr>');

});
<table id="registered_participants" class="tablesorter">
  <thead>
    <tr>
      <th>Form</th>
      <th>Name</th>
      <th>Role</th>
      <th>Progress </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="#" class="new_participant_form">Participant Registration</a></td>
      <td>Smith Johnson</td>
      <td>Parent</td>
      <td>60% done</td>
    </tr>
  </tbody>
</table>

<input type="text" id="f_name_participant" placeholder="Name">
<input type="text" id="l_name_participant" placeholder="Surname">
<select id="new_participant_role">
  <option>Parent</option>
  <option>Child</option>
</select>
<button id="add_new_participant">Add New Entry</button>

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Lesen Sie mehr: http://api.jquery.com/on/


10

Dieses Problem konnte wie erwähnt mit den .onVersionen unter jQuery 1.7+ gelöst werden .

Leider hat dies in meinem Code nicht funktioniert (und ich habe 1.11), also habe ich verwendet:

$('body').delegate('.logout-link','click',function() {

http://api.jquery.com/delegate/

Ab jQuery 3.0 ist .delegate () veraltet. Es wurde seit jQuery 1.7 durch die .on () -Methode ersetzt, sodass von seiner Verwendung bereits abgeraten wurde. Für frühere Versionen bleibt es jedoch das effektivste Mittel, die Ereignisdelegierung zu verwenden. Weitere Informationen zum Binden und Delegieren von Ereignissen finden Sie in der .on () -Methode. Im Allgemeinen sind dies die entsprechenden Vorlagen für die beiden Methoden:

// jQuery 1.4.3+
$( elements ).delegate( selector, events, data, handler );
// jQuery 1.7+
$( elements ).on( events, selector, data, handler );

Dieser Kommentar könnte anderen helfen :)!


1

VERSUCHE DIES

Ab jQuery Version 1.7+ ist die on () -Methode der neue Ersatz für die Methoden bind (), live () und delegate ().

SO HINZUFÜGEN,

$(document).on("click", "a.new_participant_form" , function() {
      console.log('clicked');
});

Oder für weitere Informationen HIER PRÜFEN


0

** Problem gelöst ** Geben Sie hier die Bildbeschreibung ein // In delegate () -Methode geändert, um die Delegierung vom Hauptteil zu verwenden

$("body").delegate("#boundOnPageLoaded", "click", function(){
   alert("Delegated Button Clicked")
});

1
Schön, dass das bei mir funktioniert
Rae Ian

Die delegate () -Methode war in Version 3.0 veraltet. Verwenden Sie stattdessen die Methode on ().
Manoj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.