追加メソッドの後にJqueryクリックイベントが機能しない


82

したがって、テーブルに新しい行を追加するこのボタンがありますが、私の問題は.new_participant_form、appendメソッドが実行された後はクリックイベントをリッスンしないことです。

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 2013年

回答:


209

使用

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

そのため、イベントハンドラーをバインドした後に追加された場合でも、クリックは#registered_participantsクラスを持つすべての要素に委任new_participant_formされます。


4
使用した場合、パフォーマンスに不利な点はあります$(document).on('click', '.new_participant_form', function() {});か?
basZero 2013

3
@basZero 1つあります。これは、jQueryがすべてのクリックを処理#registered_participantsする必要があるためですが、公平を期すために、この速度低下は非常に小さいため、関係ありません。クリーンなため、適切な要素をターゲットにすることをお勧めします。
デニス・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/


10

この問題は、.onjQuery1.7以降のバージョンを使用して前述したように解決できます。

残念ながら、これは私のコード内では機能しませんでした(そして私は1.11を持っています)ので、私は以下を使用しました:

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

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

jQuery 3.0以降、.delegate()は非推奨になりました。jQuery 1.7以降、.on()メソッドに置き換えられたため、その使用はすでに推奨されていませんでした。ただし、以前のバージョンでは、イベント委任を使用するのが依然として最も効果的な手段です。イベントのバインドと委任の詳細については、.on()メソッドを参照してください。一般に、これらは2つの方法の同等のテンプレートです。

// 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")
});

デリゲート()メソッドはバージョン3.0で非推奨になりました。したがって、代わりにon()メソッドを使用してください。
Manojさん

1

これを試して

jQueryバージョン1.7以降では、on()メソッドがbind()、live()、delegate()メソッドの新しい代替品になっています。

だからこれを追加し、

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

または詳細については、こちらを確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.