为jqGrid的所有页面启用editGridRow方法
问题是我能够在点击当前页面有10条记录的链接时获得编辑对话框。但是当我导航到第二页时,我没有得到编辑对话框。 请提前帮助,谢谢
colModel:{ name: "FirstName", index: "FirstName", width: 100, sortable: true, editable: true, formatter: GetRow, unformat: GetCellValue }, function GetRow(cellvalue, options, rowObject) { return "" + cellvalue + ""; } $('.GetLink').click(function () { var row = $('#grid').jqGrid('getGridParam', 'selrow'); if (row) { $('#grid').jqGrid('editGridRow', row, { recreateForm: true, closeAfterEdit: true, closeOnEscape: true, reloadAfterSubmit: false,}); } else { alert("Select the row you want to edit"); } });
请重新阅读我之前的问题的答案 。 您不应该使用 $('.GetLink').click
因为它在当前存在的 a.GetLink
上注册链接。 准确地说$('.GetLink')
搜索当前存在的元素,它们具有类GetLink
并将DOM元素的返回数组作为jQuery包装器。 通过.click
您可以在每个元素上注册单独的单击手柄。 如果用户导航到第二页,按某些列排序或执行许多其他操作,则将重新创建网格主体。 之前创建的所有a.GetLink元素都将被删除, 新的 a.GetLink 新行(
元素)将插入到网格主体中。 元素将没有原因的事件处理程序。 您可以通过移动$('.GetLink').click
来解决问题$('.GetLink').click
loadComplete
回调内部,但我建议您使用beforeSelectRow
。
我之前已经给你写了关于选择之路的信息。 我在这里详细解释它是如何工作的。 HTML页面的所有元素都支持DOM接口,其中包括onclick
方法。 重要的是要理解事件处理(事件流)支持事件冒泡 ,这意味着向上传播将继续在父元素上直到Document(参见此处 )。 任何事件处理程序都可以调用Event
接口的stopPropagation
方法来防止进一步的事件传播。
因此,如果用户单击表单元格的内部元素,则click
事件处理程序将不仅绑定到元素,而且绑定到父对象的事件处理程序。 如果您在table#grid
#grid上有网table#grid
那么您可以按使用情况在整个网格上注册click handler
jQuery("#grid").click(function (e) { // e.target represent the DOM element INSIDE of the table // which was clicked });
并且在点击网格的任何内部元素时调用事件处理程序(例如,在some text
)。 e.target
为我们提供了有关被点击元素的完整信息。 我们可以使用var $td = $(e.target).closest("td")
或更好的var $td = $(e.target).closest("tr.jqgrow>td")
来访问DOM层次结构直到网格单元格。 返回的值将是DOM元素的jQuery包装器,它表示
元素。 我用$
开始相应的JavaSvript变量的名称,以使代码更具可读性并强调它是jQuery包装器。 因此$td[0]
将是DOM元素。 每个td
DOM元素都支持cellIndex
属性(参见此处和此处 )。 因此$td[0].cellIndex
是单击列的索引, colModel[$td[0].cellIndex].name
是列的名称,单击该列(其中var colModel = $(this).jqGrid("getGridParam", "colModel")
)。 如果你需要获取rowid(行
的id
属性的值),那么你可以使用$td.closest("tr.jqgrow").attr("id")
。
jqGrid的现有代码包含类似的代码
... var ts = this; // the DOM of the grid ... $(ts).click(function (e) { ... var rowid = $(e.target)("tr.jqgrow").attr("id"); ... if ($.isFunction(p.beforeSelectRow)) { var isAllowSelection = p.beforeSelectRow.call(ts, rowid, e); if (isAllowSelection) { ... } } })
因此,不需要注册额外的click
处理程序。 可以使用beforeSelectRow
回调代替。 人们应该忘记返回true
以允许选择行。
演示https://jsfiddle.net/wugfty1o/3/演示了beforeSelectRow
的用法。