2011-12-20 8 views
1

もっと面白い方法でonclickイベントのパラメータを変更する方法があるのでしょうか。私は、動的に要素を追加/削除している表を再索引付けしています。各行には、行のインデックス(およびduplicateリンク)を持つdeleteリンクがあり、変更された行IDと一致するようにパラメータを更新する必要があります。Javascript要素のイベント関数のパラメータを変更します。

現在、私のコードは

<a onclick="delRow(1)">delete</a> 

とJavaScript(簡体字)のようになります。 ...

html = element.innerHTML; 

html = html.replace(/dupRow(\\d+)/g, "dupRow(" + newIndex + ")"); 
html = html.replace(/delRow(\\d+)/g, "delRow(" + newIndex + ")"); 

element.innerHTML = html 

と私はそれが

if (element.onclick != null) { 
    element.onclick.params[0] = newIndex; 
} 
の線に沿って何かになりたいです

これを達成する方法はありますか?これが役立つならjQueryもあります。ありがとう!

更新:

@の栄光の助けのおかげでrich.okelly私はそれが推奨されませんので、私が代わりに提案.delegate()機能の.on()機能を使用し、私の問題

<script> 
... 

var newRow = '\ 
     <tr>\ 
     <td class="index" col="0">0</td>\ 
     <td>this is content...</td>\ 
     <td><a href="#" row-delete="true">Del</a></td>\ 
     </tr>'; 

// re-index table indices in a non-efficient manner 
function reIndexTable() { 
    $("#rpc-builder-table").find('.index').each(function (i) { 
     $(this).html(i) 
    }) 
} 

// add row 
function addRow() { 
    for (i = 0; i < $('#addRowCount').attr("value"); i++) { 
     $("#rpc-builder-table").append(newRow); 
    } 
    reIndexTable(); 
} 

$(document).ready(function() { 

    // add row button 
    $('#addRowsButton').on('click', function() { 
     addRow(); 
    }); 

    // delete row 
    $('#rpc-builder-table').on('click', 'td a[row-delete="true"]', function() { 
     $(this).closest('tr').remove(); 
     reIndexTable(); 
    }); 

    ... 
} 
</script> 

... 

<div> 
    <label>Rows to add: </label> 
    <input id="addRowCount" value="1" size="2" /> 
    <button id="addRowsButton">Add Row(s)</button> 
</div> 

<div><table id="rpc-builder-table"><tbody> 
    <tr> 
     <th>Idx </th> 
     <th>Some content (1)</td> 
    </tr> 
</tbody></table></div> 

... 

を解決したので。ソリューションは、うまく機能 - それは、イベントハンドラ

ハンドラ内
$("#tableID").delegate("a", "click", delRow); 

$("#tableID").on("click", "a", delRow); //jQuery 1.7 

を添付するために誰か:)インラインハンドラの代わりに

+0

これは間違った方法で行っています。関数内でクリックされたオブジェクトへの参照を使用することを検討してください。最後に、削除リンクへの参照で、削除する必要のある行を見つけることができます。これでパラメータは必要ありません。 –

答えて

2

あなたがに似たものに、あなたのhtmlを変更する場合は、次の行がに動的に追加されている場合

$('td a[data-delete="true"]').on('click', function() { 
    $(this).closest('tr').remove(); 
}); 

更新

<tr> 
    <td> 
    <a href="#" data-delete="true">delete</a> 
    </td> 
</tr> 

次に、あなたのjavascriptのようなものすることができ(テーブルは親要素のために交換可能です)、委譲メソッドを使用することができます:

$('table').delegate('td a[data-delete="true"]', 'click', function() { 
    $(this).closest('tr').remove(); 
}); 
+0

素晴らしいです、ありがとうございました! –

+0

ええとこれを振り返ってみると、リンクが動的に追加されたときにリンクが機能しません。私は$(document).readyブロック内のjavascript部分を実行しているので、私は仮定しています。イベントハンドラでこれらのリンクを設定するよりも、あなたがここにあるグローバル割り当ての代わりに作成された方が良い解決策はありますか? –

+0

@Scottyアップデートを参照 –

1

、使用イベントの委任を役に立てば幸い、

var row = $(this).closest("tr").index(); //Get the index of the parent row 

インラインハンドラを取得します関数に解析される:

function onclick() { 
    delRow(1); 
} 

そのように変更するのは難しいです。あなたの例は行全体を新しいパラメータで書き換えますが、これは悪い習慣です。

0

ほとんどの脳死解は、パラメータを取り除き、変数isnteadを設定しています。

var row_to_dup = 42; 

$("#a_row_dupper").bind('click', function(){ 
    dupItem(row_to_dup); 
}); 

//changing the row to dup 
row_to_dup = 17; 
関連する問題