JQuery 3.6.0 没有找到过滤事件?

JQuery 3.6.0 filter events for nothing found?

在下面的一小段代码中。当过滤器 returns 什么都没有时,我试图隐藏微调器。当 filter returns 最后调用 hide() 函数时它起作用但是当 filter returns 什么都没有时,我无法弄清楚在 filter returns 时隐藏微调器的位置没有

var $rows = $(TableName + ' tr').not('thead tr');

$('#FilterSpinner').show();

$rows.show().filter(function () {
    text = $(this).text().replace(/\s+/g, ' ');
    return !reg.test(text);
}).hide('fast', function () {
    $('#FilterSpinner').hide(); // Works fine
});

我不介意使用不同的过滤方式,以便在过滤开始时显示微调器,并在过滤完成时隐藏微调器,无论是什么都没有还是什么都没有。

如果我没理解错的话,你想要:

  • 显示所有行;
  • 查找符合某些过滤条件的行;
  • 隐藏符合过滤器的那些;
  • 完成后隐藏微调器,确保等到上一步完成;

您已完成 AFAICT 的 90% - 也许您正在寻找更聪明的解决方案,但只需将代码拆分一下就可以轻松实现。这样的事情怎么样:

// 1. Show all rows
$rows.show();

// 2. Find matches
var $filtered = $rows.filter(function () {
    text = $(this).text().replace(/\s+/g, ' ');
    return !reg.test(text);
});

// 3. Hide any matches, then hide the spinner
if ($filtered.length) {
    $filtered.hide('fast', function () {
        $('#FilterSpinner').hide();
    });
} else {
    // ... or simply hide the spinner if there are no matches
    $('#FilterSpinner').hide();
}

旁注 - 您还可以缓存微调器选择器,就像您已经在处理其他变量一样:

var $spinner = $('#FilterSpinner');
...
$spinner.hide();