javascript - 消除键盘输入的抖动?

标签 javascript kendo-ui kendo-grid searchbar debouncing

我正在使用 Kendo UI 来网格显示数据库中的一堆数据。连接到这个网格,我有一个搜索栏。现在,以下代码在网格中搜索搜索栏中的输入类型:

searchBar = $("#search");
searchBar.keyup(() => {
    const term = searchBar[0].value;
    searchGrid(term, "#Grid", filters);
});

searchGrid 的工作原理并不重要。这里重要的是事件绑定(bind)到 keyup:当用户键入时,我希望网格立即进行过滤。我不希望他们输入他们的选择,然后按按钮进行搜索 - 这不是我的用例。我需要它在他们键入时自动过滤。

话虽如此,这就是我的问题所在。在存储有固定数量数据的网格上,这是没有问题的。效果很好。然而,在我当前工作的特定网格上,有超过 1000 个条目。由于搜索是通过 keyup 绑定(bind)的,因此当它尝试过滤数千次时,它会变得非常慢。有人告诉我,如果我在用户输入时使用去抖动来使搜索停止大约 200 毫秒,而不是在每次字母更改时触发它,我可以大大改进这一点。唯一的问题是,我似乎根本无法让去抖发挥作用。这是我粘贴到代码库中的去抖动函数:

function debounced(delay, fn) {
    let timerId;
    return function (...args) {
        if (timerId) {
            clearTimeout(timerId);
        }
        timerId = setTimeout(() => {
            fn(...args);
            timerId = null;
        }, delay);
    }
}

以下是我尝试将 debounce 函数与我之前提供的代码片段结合使用来停止搜索的一些方法,但没有一个有效:

searchBar = $("#search");
searchBar.keyup(() => {
    const term = searchBar[0].value;
    debounced(200, searchGrid(term, "#Grid", filters));
});
searchBar = $("#search");
searchBar.keyup( () => debounced(200, searchGrid(searchBar[0].value, "#Grid", filters)));

这些只是正常过滤网格,并且与我提供的第一个片段没有任何不同。所以,显然,反跳根本没有发生。我尝试完全删除箭头函数,然后将去抖函数传递到 keyup 中,并收到此新错误:

未捕获类型错误:fn 不是函数

所以我对如何使用去抖动有点不知所措。任何帮助将不胜感激。

最佳答案

我在之前的项目中使用过此代码

  var timeout;
  var delay = 500;   // 100 ms

  $('#searchTerm').keyup(function(e) {
    if(timeout) clearTimeout(timeout);
    timeout = setTimeout(function() { performSearch(); }, delay);
  });

  function performSearch() {
    var panelbar, filter, searchRegEx, $span;

    filter = $("#searchTerm").val();
    if (filter == lastFilter) return;

    if (filter.length < 3) return;  // only search 3 or more characters in searchTerm

    … the rest is unimportant … 

    lastFilter = filter;
  }

关于javascript - 消除键盘输入的抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383694/

相关文章:

javascript - 背景颜色在手机上消失

javascript - 同时使用 Vuex 和发出事件

javascript - 在发送到客户端之前乱码 JavaScript 代码

javascript - Angularjs ng-click 在 Kendo Grid 中不起作用

Javascript - 如何动态地将对象添加到 kendo ui 网格中的列数组?

javascript - Jquery 或 Javascript : which is faster and more fit in this scenario

jquery - Kendo UI Grid 单击下拉菜单激活

kendo-ui - 剑道分组不起作用

javascript - Kendo 数据源上的复杂过滤

javascript - 来自返回 JSON 的 KendoUI 网格页脚附加内容