Подія натискання 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.