我想你的代码$(".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
orloadComplete
的代码
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
事件处理程序。请参阅下一个演示。
顺便说一句,您实际上并不需要将每个绑定<button>
到click
事件处理程序。众所周知,如果click
按钮上没有事件处理程序,则会发生事件冒泡。click
因此,不必每次在加载和重新加载网格时绑定事件处理程序,只需在整个网格体上定义一次相应的事件处理程序即可。换句话说,您可以使用onCellSelect
回调。使用起来很舒服,因为rowid
点击单元格的列的和索引已经计算过了。此外,根据回调的第 4 个参数e
,onCellSelect
您可以访问事件处理程序,其中e.tagret
是 clicked 的 DOM 元素<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
. 取而代之的是,您只需验证列 index iCol
。如果需要,您可以改为测试列名。您可以使用
$(this).jqGrid("getGridParam", "colModel")[iCol].name
将 转换iCol
为相应的列名。