Подія натискання Jquery не працює після методу додавання


82

Отже, у мене є ця кнопка, яка додає новий рядок до таблиці, однак моя проблема полягає в тому, що вона більше не слухає .new_participant_formподію натискання після того, як відбувся метод додавання.

http://jsfiddle.net/cTEFG/

Натисніть Додати новий запис, а потім натисніть на форму.

$('#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> 

Проблема полягає в тому, що подія прикріплюється лише до new_participant_formелемента, який уже є в документі. Щоб це працювало для елементів, які ви також додасте пізніше, ви можете використати делегування подій, як показав dystroy, або прикріпити обробник до кожного анкера перед тим, як вставити його (перший є більш ефективним).
Асад Саедуддін

Відповіді:


209

Використовувати на :

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

Таким чином, клацання делегується будь-якому елементу, що #registered_participantsмає клас new_participant_form, навіть якщо він доданий після того, як ви зв'язали обробник події.


4
Чи є якийсь недолік щодо продуктивності, якщо ви використовуєте $(document).on('click', '.new_participant_form', function() {});?
basZero

3
@basZero Є один, оскільки jQuery тоді повинен обробляти всі кліки, а не лише той, що на, #registered_participantsале, чесно кажучи, це уповільнення настільки мало, що не має значення. Здебільшого краще орієнтуватися на правильний елемент, оскільки він чистіший.
Denys Séguret

35

.on()Метод використовується для делегування подій до елементів, динамічно додані або вже присутніх в DOM:

// 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>

Детальніше: http://api.jquery.com/on/


11

Цю проблему можна було вирішити, як уже згадувалося, за допомогою .onверсій jQuery 1.7+.

На жаль, це не працювало в моєму коді (а у мене 1.11), тому я використав:

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

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

Станом на jQuery 3.0, .delegate () застаріло. Його було замінено методом .on () з jQuery 1.7, тому його використання вже було відмовлено. Однак у попередніх версіях він залишається найбільш ефективним засобом використання делегування подій. Більше інформації про прив'язку та делегування подій наведено у методі .on (). Загалом, це еквівалентні шаблони для двох методів:

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

Цей коментар може допомогти іншим :)!


2

** Проблема вирішена ** введіть тут опис зображення // Змінено метод delegate () для використання делегування з тіла

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

Метод delegate () застарілий у версії 3.0. Тож використовуйте замість цього метод on ().
Manoj

1

СПРОБУЙТЕ ЦЕ

Починаючи з jQuery версії 1.7+, метод on () є новою заміною методів bind (), live () та delegate ().

ТАК ДОДАТИ ЦЕ,

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

Або для отримання додаткової інформації ПЕРЕВІРИТИ ТУТ

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.