为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript函数过滤三个不同的列表

Javascript函数过滤三个不同的列表

慕码人2483693 2023-11-02 21:33:54
我对 javascript 完全陌生,所以请原谅我的新手。我希望根据文本框中输入的内容过滤三个不同的列表。我的函数仅对第一个列表进行排序,并且仅当我“按 Id 获取元素”而不是类时进行排序。我的想法是按类获取元素,从而过滤所有三个列表,但它并不完全那样工作。我能做些什么?JavaScript: <script>    function filterList() {                var input, filter, ul, li, a, i, txtValue;        input = document.getElementById('searchCombo');        filter = input.value.toUpperCase();        ul = document.getElementsByClassName("drugList");        li = ul.getElementsByTagName('li');                for (i = 0; i < li.length; i++) {            a = li[i].getElementsByTagName("a")[0];            txtValue = a.textContent || a.innerText;            if (txtValue.toUpperCase().indexOf(filter) > -1) {                li[i].style.display = "";            } else {                li[i].style.display = "none";            }        }    }</script>HTML 列表:<input type="text" id="searchCombo" onkeyup="filterList()" placeholder="Search for names.."><ul ID="list1" class="drugList">    <li><a href="#">List 1 element 1</a></li>    <li><a href="#">List 1 element 2</a></li>    <li><a href="#">List 1 element 3</a></li></ul><ul ID="list2" class="drugList">    <li><a href="#">List 2 element 1</a></li>    <li><a href="#">List 2 element 2</a></li>    <li><a href="#">List 2 element 3</a></li></ul><ul ID="list3" class="drugList">    <li><a href="#">List 3 element 1</a></li>    <li><a href="#">List 3 element 2</a></li>    <li><a href="#">List 3 element 3</a></li></ul>
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

我建议您使用Element.querySelectorAll()来过滤 drugList 类中的 li 元素。然后迭代元素:

const nothingFound = document.querySelector('.nothingFound');

nothingFound.style.display="none";

const searchCombo = document.getElementById('searchCombo');

searchCombo.addEventListener("keyup", (e)=> {

  const {value} = e.target;

  const liElements=Array.from(document.querySelectorAll(".drugList li"));

  let count = 0;

  liElements.forEach(li => {

    li.style.display = "none"

    if(li.textContent.toLowerCase().includes(value.toLowerCase())) {

      li.style.display = "";

      ++count;

    }

  });


  nothingFound.style.display = count > 0 ? "none": "";

});

    <input type="text" id="searchCombo" placeholder="Search for names..">


    <ul ID="list1" class="drugList">

        <li><a href="#">List 1 element 1</a></li>

        <li><a href="#">List 1 element 2</a></li>

        <li><a href="#">List 1 element 3</a></li>

    </ul>


    <ul ID="list2" class="drugList">

        <li><a href="#">List 2 element 1</a></li>

        <li><a href="#">List 2 element 2</a></li>

        <li><a href="#">List 2 element 3</a></li>

    </ul>


    <ul ID="list3" class="drugList">

        <li><a href="#">List 3 element 1</a></li>

        <li><a href="#">List 3 element 2</a></li>

        <li><a href="#">List 3 element 3</a></li>

    </ul>

  <span class="nothingFound">Nothing found in this category</span>

另外,您应该考虑使用 css 类而不是 element.style.display。



查看完整回答
反对 回复 2023-11-02
?
弑天下

TA贡献1818条经验 获得超8个赞

我写它主要是为了看看我会写什么。我在这里发布了以防有人感兴趣。


const select_all = (selector, selectee = document) =>

  Array.from(selectee.querySelectorAll(selector));


const hide_item = item => item.style.display = 'none';

const show_item = item => item.style.display = '';

const item_text = item => item.textContent.toLowerCase() + ' ' + item.dataset.keywords;

const compare   = text => item => item_text(item).includes(text);

const has_class = class_name => item => item.className.includes(class_name);

const not_has_class = class_name => item => !has_class(class_name)(item);

const both = (pred_a, pred_b) => item => pred_a(item) && pred_b(item);


const filter_list = text => list => {

  const lis = select_all("li", list);

  

  let to_show = lis.filter(both( not_has_class('none'), compare(text) ));

  if(to_show.length === 0)

    to_show = lis.filter(has_class('none'));

  

  lis.forEach(hide_item);

  to_show.forEach(show_item);

};


const filter = (event) =>

  select_all(".drugList").forEach(

    filter_list((event?.target?.value || '').toLowerCase())

  );


document.getElementById('searchCombo').addEventListener("keyup", filter);


filter();

<input type="text" id="searchCombo" placeholder="Search for names..">


<ul ID="list1" class="drugList">

    <li data-keywords="additional keywords"><a href="#">List 1 element 1</a></li>

    <li data-keywords="bob fred"><a href="#">List 1 element 2</a></li>

    <li data-keywords="jane neela"><a href="#">List 1 element 3</a></li>

    <li class="none">Nothing found in this category</li>

</ul>


<ul ID="list2" class="drugList">

    <li><a href="#">List 2 element 1</a></li>

    <li><a href="#">List 2 element 2</a></li>

    <li><a href="#">List 2 element 3</a></li>

    <li class="none">Nothing found in this category</li>

</ul>


<ul ID="list3" class="drugList">

    <li><a href="#">List 3 element 1</a></li>

    <li><a href="#">List 3 element 2</a></li>

    <li><a href="#">List 3 element 3</a></li>

    <li class="none">Nothing found in this category</li>

</ul>


查看完整回答
反对 回复 2023-11-02
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信