javascript - 当 jQuery 过滤器不返回任何内容时显示消息

标签 javascript jquery html filter

我在网上找到了按文本内容过滤元素的代码。
当没有匹配时如何显示消息?

$("button").click(function() {
  var value = $(this).data('value').toUpperCase();
  $("div").filter(function(index) {
    $(this).toggle($(this).text().indexOf(value) > -1)
  });
});
<button>example</button>

最佳答案

您正在使用 filter() 根据状态切换每个项目,例如使用 each() 。但 filter() 的优点之一是您可以返回缩减的选择并计算它包含的项目数。该值可以确定是否应显示“不匹配”消息。

... the .filter() method constructs a new jQuery object from a subset of the matching elements. The supplied selector is tested against each element; all elements matching the selector will be included in the result. -- filter().

For each element, if the function returns true (or a "truthy" value), the element will be included in the filtered set; otherwise, it will be excluded. -- Using a Filter Function

因此,不要直接从过滤器调用中切换项目,而是考虑返回当前项目是否匹配的 bool 值度量。将生成的过滤选择保存在变量中。过滤后,您可以整体切换该选择:

var $filtered = $items.filter(function() {
  return $(this).text().indexOf(value) > -1;
});

$items.toggle(false);
$filtered.toggle(true);

这会隐藏所有项目,然后仅显示过滤后的项目。
您甚至可以考虑一些淡入淡出的动画:

$items.hide(250);
$filtered.stop(true,false).show(250);

然后您可以引用过滤后的选择的 length .
如果为零,则显示“未找到”消息:

var hasMatches = $filtered.length;

if (hasMatches) {
  // there were matches.
} else {
  // no matches.
}

您还可以传递selector到过滤器。 jQuery 的 :contains() selector选择“包含指定文本的所有元素”,这是一个不错的选择。

工作示例:

var $items = $('.item');
var $none = $('#none');
var fade = 250;

function filterContent() {

  // get word from value of clicked button.
  var word = this.value;

  // hide items; filter; show filtered; count matches
  var hasMatches = $items
    .hide(fade)
    .filter(':contains(' + word + ')')
    .stop(true, false)
    .show(fade)
    .length;

  // if no matches, show message.
  if (hasMatches) {
    $none.hide(fade);
  } else {
    $none.show(fade);
  }

}

$('button').on('click', filterContent);
#none {
  display: none;
  color: darkred;
}

#buttons {
  margin: 1em 0 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="item">Here is some text.</div>
<div class="item">Here is some other text.</div>
<div class="item">Here is some other different text.</div>
<div class="item">Here is something else.</div>
<div class="item">Here is some additional text.</div>

<div id="none">No matches found.</div>

<nav id="buttons">
  <button type="button" value="">all</button>
  <button type="button" value="text">text</button>
  <button type="button" value="other">other</button>
  <button type="button" value="additional">additional</button>
  <button type="button" value="bazooka">bazooka</button>
</nav>

<小时/>

另一种方式:

如果您愿意,您可以在过滤器内部进行切换,只要您仍然从函数返回状态 bool 值即可。我建议创建一个单独的函数来传递给过滤器。在本例中,toggleItem() 确定项目的状态(匹配或不匹配),根据该状态切换项目,然后返回该状态。

var $items = $('.item');
var $none = $('#none');

function toggleItem(word) {
  return function(k, el) {
    var $item = $(el);
    var state = $item.text().indexOf(word) > -1;
    $item.toggle(state);
    return state;
  }
}

function filterContent() {

  // get word from value of clicked button.
  var word = this.value;

  // filter while toggling and count result.
  var hasMatches = $items
    .filter(toggleItem(word))
    .length;

  // if no matches, show message.
  $none.toggle(!hasMatches);

}

$('button').on('click', filterContent);
#none {
  display: none;
  color: darkred;
}

#buttons {
  margin: 1em 0 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="item">Here is some text.</div>
<div class="item">Here is some other text.</div>
<div class="item">Here is some other different text.</div>
<div class="item">Here is something else.</div>
<div class="item">Here is some additional text.</div>

<div id="none">No matches found.</div>

<div id="buttons">
  <button type="button" value="">all</button>
  <button type="button" value="text">text</button>
  <button type="button" value="other">other</button>
  <button type="button" value="additional">additional</button>
  <button type="button" value="bazooka">bazooka</button>
</div>

在我看来,这有点难以阅读,并且不像链接的“隐藏、过滤、显示、长度”命令那么清晰,但这在某种程度上是一个风格问题。你看,这个蛋糕的烤法有很多种!

这个非常短而甜蜜:

var $none = $("#none");
var $items = $(".item");

$("button").click(function() {

  var value = $(this).data('value');

  $items.each(function() {
    $(this).toggle($(this).text().indexOf(value) > -1);
  });

  $none.toggle(!$items.filter(':visible').length);

});
#none {
  display: none;
  color: darkred;
}

#buttons {
  margin: 1em 0 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="item">Here is some text.</div>
<div class="item">Here is some other text.</div>
<div class="item">Here is some other different text.</div>
<div class="item">Here is something else.</div>
<div class="item">Here is some additional text.</div>

<div id="none">No matches found.</div>

<nav id="buttons">
  <button type="button" data-value="">all</button>
  <button type="button" data-value="text">text</button>
  <button type="button" data-value="other">other</button>
  <button type="button" data-value="additional">additional</button>
  <button type="button" data-value="bazooka">bazooka</button>
</nav>

关于javascript - 当 jQuery 过滤器不返回任何内容时显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671863/

相关文章:

javascript -::: 在 javascript 中是什么意思

javascript - Service Worker 抛出 net::ERR_FILE_EXISTS 错误?

jquery - 使用 jquery undefined variable ;可能的格式冲突

html - 服务器端的服务器发送事件成本

html - 如何使页脚与内容保持一致?

javascript - 如何在 Chrome 应用程序中包含 jQuery?

JavaScript 返回错误

php - 在 PHP session 中保存数组

javascript - 包含应更改状态的图标的按钮元素

javascript - 使用 ng-change Angular 隐藏元素