使用 Chrome 的内置搜索功能时,Handsontable 未完全呈现

Handsontable is not fully rendered when using Chrome's built in search function

使用 Chrome 的内置搜索功能时,我 运行 遇到了奇怪的、不一致的问题。我有大约 250 行数据要在手控器中呈现,多于无需滚动或缩小即可显示在屏幕上的数据。

http://jsfiddle.net/hU6Kz/3723/

var myData = [
    ["", "Kia", "Nissan", "Toyota", "Honda"],
    ["lots of data begins here"],
             ];

$("#exampleGrid").handsontable({
    data: myData,
    startRows: 5,
    startCols: 5,
    minSpareCols: 1,
    minSpareRows: 1,
    rowHeaders: true,
    colHeaders: true,
    contextMenu: true
});

观察一下,当你第一次拉起页面时,你可以向下滚动,所有的数据都呈现在handsontable中。

现在按 control + f 调出 Chrome 的内置搜索功能。搜索 handsontable 中的任何字符。 handsontable 中的大部分数据不再呈现!如果我搜索其他内容,偶尔会再次呈现数据,但似乎不一致,我找不到共同原因..

这在firefox中似乎不是问题,但我所在的公司却断然属于Chrome阵营。互联网高手们,帮帮我吧。

这是因为 Handsontable 使用了一种叫做 "Virtual Rendering" 的绝妙技术,它只呈现您当前正在查看的行以及其他一些行。它可以显示 "infinitely" 多行。 ctrl+f 的问题在于它会搜索 HTML 文本,因此您将无法使用它进行搜索。

这就是为什么有一个可用的搜索插件,它 returns 为您提供所有匹配单元格的列表。从那里你可以做很多事情,比如在输入时,scrollTo 下一个可用的匹配单元格(搜索)。另一个非常著名的应用是通过用更少的数据重新创建 table 来过滤行(过滤器)。

这里有一个使用 handsontable 搜索功能的工作演示。

在搜索输入中输入 Test 然后按 Enter

这是执行上述操作的方法。

var searchField = document.getElementById('search_field');

Handsontable.Dom.addEvent(searchField, 'keyup', function (event) {
  if (event.keyCode == 13) {
    var queryResult = hot.search.query(this.value);
    hot.selectCell(queryResult[0].row, queryResult[0].col);
  }
});

http://jsfiddle.net/pdivasto/hp8ge8kk/