jQueryのlive()にとても助けられた。
画面にて、ユーザ操作で検索条件の入力行を追加/削除する。
ってことをやりたかったわけですが、
これまた、普通に.click()で、バインドすると、動的に追加した行(というかボタン)に対しては、
イベントが動かないわけです。
onclick=""を含むような行を追加するのも格好悪いなぁ・・・
と思っていたところ、1.3以降で追加されたliveで解決。
というわけでメモ。
予想通りに動かないサンプル
<html> <head> <meta http-equiv=Content-Type content="text/html; charset=Windows-31J"> <title>liveサンプル</title> <script type="text/javascript" src="../../common/jquery-1.3.1.min.js"></script> <script type="text/javascript"> //行番号を保持 var cnt = 1; $(function(){ //削除ボタンイベント $(".delBtn").click(function() { //ボタンのrowId属性値を取得 var rowId = $(this).attr("rowId"); //本当は行を削除する処理 alert(rowId); }); //行追加ボタンイベント $("#addRow").click(function() { //行番号を追加してIDとする。 var rowId = "row" + (++cnt); //元となる行をコピーして、属性を修正する。 var newRow = $("#row1").clone(); newRow.attr("id", rowId); $(".delBtn", newRow).attr("rowId", rowId); //テーブルに行を追加 $("#rowTable").append(newRow); }); }); </script> </head> <body> <input type="button" id="addRow" value="追加"></input> <table border="1" id="rowTable"> <tr id="row1"> <td> <input type="button" value="削除" class="delBtn" rowId="row1"> </td> <td> <input type="text"> </td> </tr> </table> </body> </html>
$(".delBtn").click(function() {
ここを、
$(".delBtn").live("click", function() {
のように書き換えると、追加した行の削除ボタンでも反応してくれます。
IDやら、classやら適当だったり、
独自属性使っていたり、
行番号を固定で連番にしてたり、
実際には行を消していなかったり、
面倒なので、ベースとなる行を用意していたりと、
まぁどうかと思うサンプルではありますが・・・
実際には、他の入力欄もあったりとかで、name属性に連番を振りたいので、
行番号をカウンタではなく、追加/削除で再計算し、既存行の、行番号を再設定したり等もしているのですが、
それは別の話ということで省略。
・・・この魅力って伝わりますか??