禁用表列单击事件,但在列中包含锚标记

时间:2014-09-23 08:02:35

标签: jquery jqgrid

我正在使用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;
});

2 个答案:

答案 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();               
    } 
})