【问题标题】:Loop through <li> and display list containing input value循环 <li> 并显示包含输入值的列表
【发布时间】:2021-09-21 20:30:32
【问题描述】:

我有一个项目列表,例如待办事项列表,并且我有一个搜索输入,我希望用户在其中搜索列表'

我正在使用 keyup 事件,如果输入匹配,我尝试使用 css 将匹配的 li 设置为 display:'' 而不匹配的列表项我想设置 display:none。

到目前为止,我能够 console.log 我的结果,但不能影响对我的 li 列表的更改,因为设置为 display none 的 css 不起作用。

下面是我的代码。

    const Ul = document.querySelector('.clipBoard');
const search = document.querySelector('.search');
    
    
    array.forEach((item) => {
      let button = document.createElement('button');
      button.className =
        'list-group-item buttonLi';
      button.innerText += item;
      Ul.appendChild(button);
      
      
      //Search function
      search.addEventListener('keyup', () => {
        let filterValue = search.value;

        const li = Ul.querySelectorAll('.buttonLi');
        
        for (let i = 0; i < li.length; i++) {
          let List = li[i];

          if (List.innerHTML.indexOf(filterValue) > -1) {
            console.log(li[i].innerHTML);
            li[i].style.display = '';
          } else {
            li[i].style.display = 'none';
          }
        }
      });

【问题讨论】:

  • list[i] 是否真的为您提供了 HTML 元素?如果是这样,您可以在更改之前控制台记录元素的显示属性。我也认为您不应该更改为display = '',而是相应地更改为display = block
  • 是的,当我 console.log 时,list[i] 确实返回了一个 HTML 元素。 display = block 也不起作用。因为我在浏览器中的
  • 保持不变。我的意图是当用户输入时,包含输入字母的
  • 保留,而不包含输入字母的
  • 设置为 display = 'none',因此从列表中删除。
  • 我相信你最好写一个过滤器函数并将过滤器的结果传递到一个数组中,称之为searchResults,现在当你启动searchResults将等于你的原始array,但当用户搜索时,您将相应地过滤。也可以使用searchArray 来动态呈现 HTML 中的元素。请务必将您的“搜索过滤器”代码包含在回调中,并在按键按下时设置 300 毫秒超时以提高效率。所有这些都将消除您在 Javascript 中编写任何 CSS。有关更多信息,请参阅术语 Debouncing
  • 标签: javascript html css loops append


    【解决方案1】:

    我建议您使用该级别的索引为每个元素分配一个 id:

      array.forEach((item, INDEX) => {
      let button = document.createElement('button');
      var id = 'el-'+INDEX
      button.setAttribute("id", id);
      button.setAttribute("class", "list-group-item buttonLi");
      button.innerText += item;
      });
    

    然后在您的搜索功能上使用该 id 隐藏元素

          search.addEventListener('keyup', () => {
        let filterValue = search.value;
    
        const li = Ul.querySelectorAll('.buttonLi');
        
        for (let i = 0; i < li.length; i++) {
          let List = li[i];
    
          if (List.innerHTML.indexOf(filterValue) > -1) {
            console.log(li[i].innerHTML);
            // something like that
            var idToShow = '#el-'+i;
            document.querySelector(idToShow).style.display = 'block';
    
          } else {
            // something like that
            var idToHide = '#el-'+i;
            document.querySelector(idToHide).style.display = 'none';
          }
        }
      });
    

    我没有测试此代码,只是想为您指出最终的解决方案! 您还可以对数组进行过滤,然后为每次搜索重新呈现您的列表!

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签