我发现自己需要我认为应该是一个微不足道的要求。我有一个jqGrid,我在每行中添加了一个自定义按钮。现在我能够将客户端点击事件与它相关联,但我想知道我点击其自定义按钮的行的键值(Id),以便我可以继续使用此ID并执行我想要的任何操作做。
我的jqGrid代码如下
jQuery("#JQGrid").jqGrid({
url: 'http://localhost:55423/JQGrid/JQGridHandler.ashx',
datatype: "json",
colNames: ['', 'Id', 'First Name', 'Created Date', 'Member Price', 'Non Member Price', 'Complete', 'customButton'],
colModel: [
{ name: '', index: '', width: 20, formatter: "checkbox", formatoptions: { disabled: false} },
{ name: 'Id', index: 'Id', width: 20, stype: 'text', sortable: true, key: true },
{ name: 'FirstName', index: 'FirstName', width: 120, stype: 'text', sortable: true },
{ name: 'CreatedDate', index: 'CreatedDate', width: 120, editable: true, sortable: true, hidden: true, editrules: { edithidden: true} },
{ name: 'MemberPrice', index: 'MemberPrice', width: 120, editable: true, sortable: true },
{ name: 'NonMemberPrice', index: 'NonMemberPrice', width: 120, align: "right", editable: true, sortable: true },
{ name: 'Complete', index: 'Complete', width: 60, align: "right", editable: true, sortable: true },
{ name: 'customButton', index: 'customButton', width: 60, align: "right" }
],
rowNum: 10,
loadonce: true,
rowList: [10, 20, 30],
pager: '#jQGridPager',
sortname: 'Id',
viewrecords: true,
sortorder: 'desc',
caption: "List Event Details",
gridComplete: function () {
jQuery(".jqgrow td input", "#JQGrid").click(function () {
//alert(options.rowId);
alert("Capture this event as required");
});
}
});
jQuery('#JQGrid').jqGrid('navGrid', '#jQGridPager',
{
edit: true,
add: true,
del: true,
search: true,
searchtext: "Search",
addtext: "Add",
edittext: "Edit",
deltext:"Delete"
},
{/*EDIT EVENTS AND PROPERTIES GOES HERE*/ },
{/*ADD EVENTS AND PROPERTIES GOES HERE*/},
{/*DELETE EVENTS AND PROPERTIES GOES HERE*/},
{/*SEARCH EVENTS AND PROPERTIES GOES HERE*/}
);
非常感谢帮助或任何指示。
答案 0 :(得分:1)
以下问题的主要解决方案:您需要在e
句柄的回调中包含参数,例如click
。参数具有Event object类型,其中包含target属性。或者,您可以在大多数情况下使用this
。拥有e.target
后,您可以转到最近的父<tr>
元素。 id
是您需要的值:
jQuery(this).find(".jqgrow td input").click(function (e) {
var rowid = $(e.target).closest("tr").attr("id");
alert(rowid);
});
此外,您应该在代码中进行一些其他修改以修复一些错误。
的用法name: '', index: ''
{p}在colModel
中错误。您应指定任何非空的唯一名称。例如name: 'mycheck'
。
接下来,我建议您从index
删除所有colModel
属性。如果您使用loadonce: true
,则必须使用与相应index
值相同的name
属性。如果您未指定任何index
属性,则代码将更小且更易读。 jqGrid将在内部从相应的index
值复制name
属性的相应值。以同样的方式,您可以移除stype: 'text', sortable: true
等属性默认值的属性(请参阅the documentation的Default
列)
下一个问题是您可能在服务器的JSON响应中包含HTML数据。 (例如,customButton
无法看到任何格式化程序。这不好。如果网格的文本包含特殊的HTML符号,则会出现问题。我发现在服务器的JSON响应中使用纯数据更好。可以在客户端使用格式化程序custom formatters等。在这种情况下,可以使用jqGrid的autoencode: true
选项,它对网格中显示的所有文本进行HTML编码。在这种情况下,您将拥有更安全的代码,不允许任何注入(例如,在编辑数据期间不包括JavaScript代码)。
下一条评论:我不建议您使用gridComplete
。 loadComplete
的使用效果更好。有关该主题,请参阅my old answer。
最后一个重要的评论。要处理位于网格内部的按钮上的click
个事件,不需要将单独的click
句柄绑定到每个按钮。而不是那个可以使用一个 beforeSelectRow
或onCellSelect
回调。 The answer和this on e描述了这一点。答案在自定义格式化程序中使用<a>
,但<input>
完全以相同的方式工作。
答案 1 :(得分:0)
另一种可用于检索单击自定义按钮的行的ID的方法是将格式化程序添加到自定义按钮cloumn
{ name: 'customButton', index: 'customButton', width: 60, align: "right",
formatter: function ( cellvalue, options, rowObject ) {
return "<input type='button' class='custom-button' id='custom"+ rowObject.id +"'/>";
}
}
现在每个按钮都有行ID
$('input[id^="custom"]').click(function() {
var id = this.attr('id').replace("custom", ""); // required row ID
});