防止在列标题单击时选择 Handsontable 单元格

Posted

技术标签:

【中文标题】防止在列标题单击时选择 Handsontable 单元格【英文标题】:Prevent Handsontable cells from being selected on column header click 【发布时间】:2015-11-19 15:57:27 【问题描述】:

在 Handsontable 中,当单击列标题时,会选择该列的所有单元格。有办法防止这种情况发生吗?

我认为文档中没有这样的选项。我也没有在 Handsontable 库本身的源代码中找到事件在 DOM 上的注册位置。

任何提示将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

我认为不可能阻止这种行为。我在文档中也没有找到任何线索,也没有快速检查源代码。

但是,您可以在选中单元格后立即取消选中它们。绑定一个函数来处理单元格点击事件就可以了。你可以通过在实例化你的handsontable时注册回调来做到这一点:

$('#my_handsontable').handsontable(
   ...
   afterOnCellMouseDown: function(event, coords)
       // 'coords.row < 0' because we only want to handle clicks on the header row
       if (coords.row < 0)
           $('#my_handsontable').handsontable('deselectCell');
       
   ,
   ...
);

或者通过钩子:

Handsontable.hooks.add('afterOnCellMouseDown',  function(event, coords)
    if (coords.row < 0)
        $('#my_handsontable').handsontable('deselectCell');
    
);

或者,您可以编辑可操作的源代码并在 walkontableConfig 中添加在单击标题单元格时选择整列的代码段:

var walkontableConfig = 
   ...
   onCellMouseDown: function (event, coords, TD, wt) 
      ...
      // if (coords.row < 0) 
         // instance.selectCell(0, coords.col, instance.countRows() - 1, coords.col);
         // instance.selection.setSelectedHeaders(false, true);
      // 
      ...
   ,
   ...
;

【讨论】:

嗯,我得试试这个,但我想这对我不起作用,因为我已经迷上了“单元格选择”。它甚至会执行异步操作,因此在之后立即执行“取消选择”可能会产生不良行为。我一定会试一试并报告。非常感谢您的回复。 或者,您可以编辑可动手操作的源以删除该行为。请参阅我上面的编辑答案。就个人而言,我不喜欢编辑第三方库,因为这会在升级这些库时增加额外的复杂性,但在某些情况下,这可能是唯一的解决方案。 是的,我也不喜欢这样做,但是嘿,如果我能走那么远,那可能是一个不错的贡献:让它成为可选的。感谢您的提示。 哦,我想我找到了替代解决方案。我可以挂上beforeOnCellMouseDown 并在那里执行您建议的解决方案并阻止事件传播。我马上试试。【参考方案2】:

可以使用beforeOnCellMouseDown 钩子阻止事件传播,这可以防止被点击的标题列的单元格被选中:

/**
 * @param MouseEvent event
 * @param WalkontableCellCoords coords
 * @param Element element
 */
var handleHotBeforeOnCellMouseDown = function(event, coords, element) 
  if (coords.row < 0) 
    event.stopImmediatePropagation();
  
;

Handsontable.hooks.add('beforeOnCellMouseDown',
    handleHotBeforeOnCellMouseDown, handsontable);

非常感谢 Gustavo 的帮助!

【讨论】:

stopPropogation 在某些情况下可能是更好的选择(请参阅***.com/questions/5299740/…) 这在 0.18 中对我不起作用。事件触发正常,但调用 stopImmediatePropagation() 不会阻止单元格选择 与@Eric 相同的问题【参考方案3】:

是的,有一个技巧,或者我们可以说选项来防止在标题单击时选择单元格。 “只需将 selectionMode 设置为单曲即可。”

试试下面的代码:

document.addEventListener("DOMContentLoaded", function() 

var example1 = document.getElementById('example1');
var selectOption = document.getElementById('selectOption');
var settings1 = 
    data: Handsontable.helper.createSpreadsheetData(10, 10),
    width: 700,
    height: 272,
    colWidths: 75,
    rowHeights: 20,
    rowHeaders: true,
    colHeaders: true,
    selectionMode: 'single', // 'single', 'range' or 'multiple',
;
var hot1 = new Handsontable(example1, settings1);
);

【讨论】:

以上是关于防止在列标题单击时选择 Handsontable 单元格的主要内容,如果未能解决你的问题,请参考以下文章

handsontable / javascript - 禁用通过拖动添加的新行

如何在 html 按钮单击时获取 Handsontable 数据

选择 Handsontable 标题单元格

jQuery Datepicker:单击日期时防止关闭选择器

Handsontable中的反向列和行标题

在列标题单击时使 WPF ListView/GridView 排序的最佳方法?