javascript - 当所有 div 都被隐藏时,如何显示消息 "no results"?

标签 javascript html

我有一个显示了一些 div 的网页。网上商店使用一些过滤器来过滤特定项目。现在,如果所有 div 都有 display:none,我想显示消息“无结果”。

我该怎么做?

我尝试了一些东西,比如:

if ($('filters')(':visible').length == 0) {
  document.textContent('No results');
}

但这不起作用。

const buttons = document.querySelectorAll('.btn');
const composers = document.querySelectorAll('.filterDiv');

buttons.forEach((btn) =>
  btn.addEventListener('click', (e) => {
    e.target.classList.toggle('active');
    filterSelection();
  }),
);

function filterSelection() {
  const filters = [...document.querySelectorAll('.btn.active')].map(
    (el) => el.dataset.filter,
  );
  composers.forEach(
    (c) =>
    (c.style.display =
      filters.length === 0 || c.matches(`.${filters.join('.')}`) ?
      'block' :
      'none'),
  );
}
<div id="filters">
  <div id="myBtnContainer">
    <p>Period</p>
    <button data-filter="Barok" class="btn">Barok</button>
    <button data-filter="Classic" class="btn">Classic</button>
    <button data-filter="Renaissance" class="btn">Renaissance</button>
    <button data-filter="Romantic" class="btn">Romantic</button>
  </div>
  <div id="myBtnContainer">
    <p>Composer</p>
    <button data-filter="DiLasso" class="btn">De Lassus</button>
    <button data-filter="Bach" class="btn">Bach</button>
    <button data-filter="Vivaldi" class="btn">Vivaldi</button>
    <button data-filter="Schubert" class="btn">Schubert</button>
    <button data-filter="Tchaikovsky" class="btn">Tchaikovsky</button>
  </div>
</div>
<div class="container" id="myUL">
  <div class="filterDiv Renaissance DiLasso">Di Lasso -Lagrime de San Pietro</div>
  <div class="filterDiv Renaissance">Sweelinck - Fantasie</div>
  <div class="filterDiv Classic">Haydn - The Seasons</div>
  <div class="filterDiv Romantic">Wagner - Parsifal</div>
  <div class="filterDiv Classic">Mozart - Requiem</div>
  <div class="filterDiv Barok Bach">Bach - Magnificat</div>
  <div class="filterDiv Classic">Beethoven - Symphony 5</div>
  <div class="filterDiv Barok">Händel - Hallelujah</div>
  <div class="filterDiv Barok Vivaldi">Vivaldi - The Four Seasons</div>
  <div class="filterDiv Renaissance">Obrecht - Factor Orbis</div>
  <div class="filterDiv Romantic Schubert">Schubert - Erlkönig</div>
  <div class="filterDiv Romantic Tchaikovsky">Tchaikovsky - Swan Lake</div>
  <div class="filterDiv Barok Vivaldi">Vivaldi - Rosmira</div>
  <div class="filterDiv Classic">Beethoven - Moonlight Sonata</div>
</div>

最佳答案

您可以通过.filterDiv.hidden 使用一个类来控制您的隐藏元素(如果元素是隐藏的,它们将有一个类hidden)。

这种方法需要有 CSS 样式

.hidden {
   display: none;
}

const buttons = document.querySelectorAll('.btn');
const composers = document.querySelectorAll('.filterDiv');

buttons.forEach((btn) =>
  btn.addEventListener('click', (e) => {
    e.target.classList.toggle('active');
    filterSelection();
  }),
);

function filterSelection() {
  const filters = [...document.querySelectorAll('.btn.active')].map(
    (el) => el.dataset.filter,
  );
  composers.forEach((c) => {
    if (filters.length === 0 || c.matches(`.${filters.join('.')}`)) {
      c.classList.remove("hidden")
    } else {
      c.classList.add("hidden")
    }
  });

  const hiddenComposers = document.querySelectorAll('.filterDiv.hidden');

  const noResultElement = document.getElementById("noResult");

  if (composers.length === hiddenComposers.length) {
    noResultElement.classList.remove("hidden");
  } else {
    noResultElement.classList.add("hidden");
  }
}
.hidden {
  display: none;
}
<div id="filters">
  <div id="myBtnContainer">
    <p>Period</p>
    <button data-filter="Barok" class="btn">Barok</button>
    <button data-filter="Classic" class="btn">Classic</button>
    <button data-filter="Renaissance" class="btn">Renaissance</button>
    <button data-filter="Romantic" class="btn">Romantic</button>
  </div>
  <div id="myBtnContainer">
    <p>Composer</p>
    <button data-filter="DiLasso" class="btn">De Lassus</button>
    <button data-filter="Bach" class="btn">Bach</button>
    <button data-filter="Vivaldi" class="btn">Vivaldi</button>
    <button data-filter="Schubert" class="btn">Schubert</button>
    <button data-filter="Tchaikovsky" class="btn">Tchaikovsky</button>
  </div>
</div>
<div class="container" id="myUL">
  <div class="filterDiv Renaissance DiLasso">Di Lasso -Lagrime de San Pietro</div>
  <div class="filterDiv Renaissance">Sweelinck - Fantasie</div>
  <div class="filterDiv Classic">Haydn - The Seasons</div>
  <div class="filterDiv Romantic">Wagner - Parsifal</div>
  <div class="filterDiv Classic">Mozart - Requiem</div>
  <div class="filterDiv Barok Bach">Bach - Magnificat</div>
  <div class="filterDiv Classic">Beethoven - Symphony 5</div>
  <div class="filterDiv Barok">Händel - Hallelujah</div>
  <div class="filterDiv Barok Vivaldi">Vivaldi - The Four Seasons</div>
  <div class="filterDiv Renaissance">Obrecht - Factor Orbis</div>
  <div class="filterDiv Romantic Schubert">Schubert - Erlkönig</div>
  <div class="filterDiv Romantic Tchaikovsky">Tchaikovsky - Swan Lake</div>
  <div class="filterDiv Barok Vivaldi">Vivaldi - Rosmira</div>
  <div class="filterDiv Classic">Beethoven - Moonlight Sonata</div>
</div>
<div id="noResult" class="hidden">No result</div>

关于javascript - 当所有 div 都被隐藏时,如何显示消息 "no results"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74306596/

相关文章:

javascript - 如何使用javascript或jquery动态检查表格每一行中复选框的值

javascript - Node JS 中的内存错误 (node::smalloc::Alloc)

javascript - 如何使用 javascript 获取 html <td> 值?

javascript - js-bson : Failed to load c++ bson extension, 在 Windows 中的 mongoose 上使用纯 JS 版本

android - 最小宽度在 HTML/CSS 中以纵向模式在 Android 屏幕上导致额外的垂直空间

css - 如何创建带下拉菜单的水平滚动菜单?

javascript - 如何跟踪哪个 Javascript 使用给定的 HTML 元素进行操作?

javascript - 扩展原型(prototype)数组

html - 内容从 100% 高度 DIV 溢出

javascript - html 文本输入?没有值或文本属性