我正在使用jqGrid来显示用户列表。当我单击任何列时,将检查第一列中显示的复选框。
所以要禁用此功能。我已经实现了以下内容并在gridComplete
事件中编写,这在某些情况下运行良好。
$('table#user_entries tr td:not(":first-child")').click(function(e) {
e.preventDefault();
return false;
});
但它不允许我点击任何列中的链接。请建议,如何阻止所有不包含锚标记的列的点击事件。
根据我选择显示的布局,表格中有可变数量的列。
我认为jqGrid没有任何问题。好像我可以把它当作一个普通的html表,我正在寻找一个像以下的解决方案:
$('table#user_entries tr td:not("containing any anchor tag")').click(function(e) {
e.preventDefault();
return false;
});
答案 0 :(得分:1)
如果我正确理解了您的问题,则使用multiselect: true
,并且您需要以阻止选择行,点击其他列作为“multiselect”列。换句话说,您只需要更改jqGrid的行为即可。 阻止click
事件不是目标。
我在the old answer中描述了如何实现所需行为的方式。只是为了回答答案中的代码。 jqGrid已经在<table>
元素上有一个点击处理程序。在每个单元格上注册click
处理程序会更有效。网格主体将在排序或其他刷新网格时重建。所以您写道,您在click
/ grigComplete
内注册了loadComplete
个处理程序。它不是那么有效。
事件冒泡允许处理每个子元素的点击,而无需在每个子元素上注册事件处理程序。在处理click
事件jqGrid “ask” beforeSelectRow
回调期间,点击是否应该跟随行的选择。因此,您可以决定哪些点击符合行选择,哪些不符合。 e.target
是单击的元素。构造$.jgrid.getCellIndex($(e.target).closest("td")[0])
为您提供所单击列的索引。 cm[i].name
是已点击列的名称。多重选择列将由jqGrid创建,它始终具有名称“cb”。所以代码
beforeSelectRow: function (rowid, e) {
var $self = $(this),
$td = $(e.target).closest("td"),
iCol = $.jgrid.getCellIndex($td[0]),
cm = $self.jqGrid("getGridParam", "colModel");
return (cm[iCol].name === "cb");
}
仅在单击多选列的单元格时才允许选择行。
The corresponding demo演示了结果。重要的是,代码获取Web浏览器的最小资源,并且不会更改网格任何单元格上的click事件的任何行为,因此它具有无副作用。
答案 1 :(得分:0)
尝试检测点击的td中是否有锚点,如下所示: JSFidle
$('table#user_entries tr td').click(function(e) {
var linkExists = $(this).find('a').length;
if (linkExists !== 0) {
e.preventDefault();
}
})