jQuery click事件在添加方法后不起作用


82

所以我有这个按钮,它向表中添加了新行,但是我的问题是,.new_participant_form在执行append方法之后,它不再侦听click事件。

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演示的事件委托,或在插入锚之前将处理程序附加到每个锚上(前者效率更高)。
Asad Saeeduddin

Answers:


207

使用

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

这样,即使在绑定事件处理程序之后添加了单击,也可以将单击委派给#registered_participants具有class的任何元素new_participant_form


4
如果使用,在性能方面是否有任何不利之处$(document).on('click', '.new_participant_form', function() {});
basZero 2013年

3
@basZero这是一个,因为jQuery然后必须处理所有单击,而不仅仅是单击,#registered_participants但为了公平起见,此速度下降幅度很小,不相关。最好将正确的元素作为目标,因为它更干净。
DenysSéguret13年

34

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


10

如上所述,可以使用.onjQuery 1.7+版本解决此问题。

不幸的是,这在我的代码中不起作用(并且我有1.11),所以我使用了:

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

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

从jQuery 3.0开始,.delegate()已被弃用。自jQuery 1.7起,它已被.on()方法所取代,因此不鼓励使用它。但是,对于早期版本,它仍然是使用事件委托的最有效方法。有关事件绑定和委托的更多信息,请参见.on()方法。通常,这些是这两种方法的等效模板:

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

此评论可能会帮助其他人:)!


1

试试这个

从jQuery 1.7+开始,on()方法是bind(),live()和委托()方法的新替代品。

因此,

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

或了解更多信息,请点击这里


0

**在此处输入图片说明 已解决的问题** //更改为委托()方法以使用正文中的委托

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

在3.0版中不赞成使用委托()方法。因此,请改用on()方法。
马诺伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.