間違った場所に配置したため、コードが機能し$(".deleteRowButton").button({icons: {primary: 'ui-icon-trash'}, text: false});
なかったと思います。<button class='deleteRowButton' ...>
内部を作成する場合は、投稿したコードの直後の内部でもgridComplete
呼び出しを行う必要があります。$(".deleteRowButton").button(...)
gridComplete
gridComplete: function () {
var $this = $(this), ids = $this.jqGrid('getDataIDs'), l = ids.length,
i, deleteButton;
for (i = 0; i < l; i++) {
deleteButton = "<button type='button' style='height:22px;width:20px;'" +
" class='deleteRowButton' title='Delete' onclick=deleteRow(" +
ids[i] + ")></button>";
$this.jqGrid('setRowData', ids[i], { DeleteButton: deleteButton });
}
$(".deleteRowButton").button({
icons: {
primary: 'ui-icon-trash'
},
text: false
});
}
最初のデモを参照してください。
上記のアプローチのパフォーマンスには小さな問題があります。あなたを使用setRowData
して、ページに変更を加えます。ページ上のすべての変更は、ページ上に存在する他のすべての要素の位置の再計算に従います。したがって、パフォーマンスを向上させるには、グリッド上の変更の数を減らすことをお勧めします。したがって、より良い方法は、カスタム formattrerを使用することです。コードの新しいバージョンは、以前のものと実質的にまったく同じように簡単になります。関数として定義するだけですformatter
:
{ name: 'DeleteButton', width: 20,
formatter: function (cellvalue, options) {
return "<button type='button' class='deleteRowButton' " +
"style='height: 22px;width: 20px;' title='Delete'></button>";
}},
gridComplete
またはのコードをloadComplete
減らす
gridComplete: function () {
$(".deleteRowButton").button({
icons: {
primary: 'ui-icon-trash'
},
text: false
}).click(function (e) {
var $tr = $(e.target).closest("tr.jqgrow");
alert("the row with id=" + $tr.attr("id") + " need be deleted");
});
}
元のコードでは、メソッドはグローバルdeleteRow
でなければなりません(最上位で定義する必要があります)。新しいコードは、イベント ハンドラーのみを使用できます。次のデモをご覧ください。click
ちなみに、every<button>
をclick
イベント ハンドラにバインドする必要はありません。click
よく知られているように、ボタンにイベント ハンドラーがない場合、イベント バブリングが発生します。click
そのため、グリッドの読み込みと再読み込みのたびにイベント ハンドラーをバインドする代わりに、グリッド本体全体で対応するイベント ハンドラーを1 回定義するだけで済みます。つまり、onCellSelect
コールバックを使用できます。rowid
クリックしたセルの列の と インデックスが計算済みなので、使い勝手はとても快適です。e
さらに、コールバックの4 番目のパラメーターごとに、 clicked の DOM 要素であるonCellSelect
イベント ハンドラーにアクセスできます。したがって、上記のコードを置き換えることができますe.tagret
<button>
gridComplete
次のコードに:
onCellSelect: function (rowid, iCol, cellcontent, e) {
if ($(e.target).closest("button.deleteRowButton").length > 0) {
alert("the row with id=" + rowid + " need be deleted");
}
},
gridComplete: function () {
$(".deleteRowButton").button({
icons: {
primary: 'ui-icon-trash'
},
text: false
});
}
このようにして、パフォーマンスをさらに向上させ、ページに使用されるメモリを少し減らすことができます。デモでは、最後のコードがライブで表示されます。ほとんどの場合、 のような構造を使用する必要はありません$(e.target).closest("button.deleteRowButton").length > 0
。その代わりに、列のインデックスを確認するだけですiCol
。必要に応じて、代わりに列名をテストできます。使用できます
$(this).jqGrid("getGridParam", "colModel")[iCol].name
iCol
を対応する列名に変換します。