繁体   English   中英

jQuery使用关键字搜索和过滤

jQuery search and filter using keywords

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试编写一个搜索/过滤器函数,该函数根据用户键入的内容搜索具有data- *属性的无序列表项。

<input type="text" placeholder="Search..." id="myInput" onkeyup="myFunction()">        
<ul id="myUL">
    <li><a href="#" data-keywords="photography">Digital Media Design</a></li>
    <li><a href="#" data-keywords="computers">Information Technology</a></li>
    <li><a href="#" data-keywords="coding">Programming</a></li>
</ul>

这是到目前为止我只适用于一个数据关键字项的代码。 我需要帮助以获取基于多个关键字的搜索结果。

<li><a href="#" data-keywords="photography photoshop illustrator premiere">Digital Media Design</a></li>

// Search functionality
function myFunction() {
    // Declare variables
    var input, filter, ul, li, a, i;
    input = document.getElementById('myInput');
    filter = input.value.toUpperCase();
    ul = document.getElementById("myUL");
    li = ul.getElementsByTagName('li');
    // Loop through all list items, and hide those who don't match the search query
    for (i = 0; i < li.length; i++) {
        a = li[i].getElementsByTagName("a")[0];
        if (a.innerHTML.toUpperCase().indexOf(filter) > -1 || $(a).data("keywords") === filter.toLocaleLowerCase()) {
            li[i].style.display = "";
        } else {
            li[i].style.display = "none";
        }
    }
}

如果有人对我如何改善代码提出建议,那就太好了!

2 个回复

这为我工作:

// Get all li's and create an array with each li's data attributes
const lis = document.querySelector("#myUL").children;

const keywordArray = [];

[...lis].forEach((li, i) => {
  keywordArray.push(li.children[0].dataset.keywords);
});

function myFunction() {
  //Show any previous hidden li's
  [...lis].forEach(li => {
    li.style.display = 'block';
  });

  const inputArray = document.querySelector('#myInput').value.split(' ');
  const indexes = [];
  // For each word in the input field, search through our data attribute array
  inputArray.forEach(term => {
    keywordArray.forEach((keywords, i) => {
      keywords.split(' ').forEach(keyword => {
        // If we find a match, add the index of the data attribute array, which
        // will be the same as the index of the li element
        if (keyword === term) {
          indexes.push(i);
        }
      });
    });
  });
  // If we have a match, hide every non-matching li'
  if (indexes.length) {
    [...lis].forEach((li, i) => {
      if (!indexes.includes(i)) {
        li.style.display = 'none';
      }
    });
  }
}

为了澄清起见,您是否要使用其他搜索词来使搜索更具体或更具体? 因为我的解决方案使搜索不太明确,因为它将显示与任何搜索词匹配的li。

我做了一些假设:

  • 如果提供了多个搜索词,则它们必须全部匹配。
  • 搜索词必须是字母az。 可以很容易地更改它以包括其他字符,例如数字,但是最终我们需要一种方法来确定一个术语在哪里结束而下一个术语在哪里开始。
  • 匹配基于子字符串。

最需要解释的位是那个正则表达式。 它使用标准技巧来进行and匹配:

正则表达式:是否有AND运算符?

因此,如果您搜索digital photography ,RegExp将等同于:

/(?=.*digital)(?=.*photography)/i

如果您想搜索“是” or不是” and则只需要相应地调整RegExp。 如果你想做一个开始,与之相匹配的,而不是子串,你可以扔在\\b每个搜索词前(适当转义为\\\\b在字符串中)。

我希望其余的内容可以不言自明,我试图使代码保持在问题中。

 // Search functionality function myFunction() { // Declare variables var input = document.getElementById('myInput'), filter = input.value, ul = document.getElementById('myUL'), lis = ul.getElementsByTagName('li'), searchTerms = filter.match(/[az]+/gi), re, index, li, a; if (searchTerms) { searchTerms = searchTerms.map(function(term) { return '(?=.*' + term + ')'; }); re = new RegExp(searchTerms.join(''), 'i'); } else { re = /./; } // Loop through all list items, and hide those who don't match the search query for (index = 0; index < lis.length; index++) { li = lis[index]; a = li.firstChild; if (re.test(a.innerHTML + ' ' + a.getAttribute('data-keywords'))) { li.style.display = ''; } else { li.style.display = 'none'; } } } 
 <input type="text" placeholder="Search..." id="myInput" onkeyup="myFunction()"> <ul id="myUL"> <li><a href="#" data-keywords="photography photoshop illustrator premiere">Digital Media Design</a></li> <li><a href="#" data-keywords="computers">Information Technology</a></li> <li><a href="#" data-keywords="coding">Programming</a></li> </ul> 

1 使用关键字通过jQuery搜索JSON

我正在尝试通过关键字专门搜索JSON。 我已经成功通过ID(在下面的代码中为“标签”)进行了搜索。 虽然,我想做的是在“标签”的ID中进行搜索,但要通过关键字“已折旧”进行搜索。 仅选择JSON中带有“已贬值”的方括号。 然后,将标题和uri从中拉出并写入文档,就像我在代码中一样。 ...

3 按关键字jquery过滤

我一直在寻找可以在我的网页上实现一个按关键字过滤的输入框的方法,就像buysellads.com 在此处使用的那样,您可以在其中输入与该网站相关的关键字并自动过滤列表。 例如,如果您键入“ photoshop”,它将捕获所有包含带有Photoshop标签的网站。 我也想在通过“ phot ...

4 jQuery关键字搜索

我正在使用jquery从显示的列表中搜索记录。 通过在显示记录的表中输入单个单词或完整单词来搜索记录。 现在问题出在记录表中,我有一列id。 当用户输入ID号时,将相应地搜索记录。 我想允许用户从指定的列中搜索记录,即:标题,作者等,而不是ID /页面。 这是jQuery代码: ...

6 带有选择和关键字搜索的jQuery同位素过滤器无法一起使用

我正在尝试用同位素库过滤我的画廊。 我有一个单独工作的按钮列表和一个单独工作的文本框。 我正在尝试将它们组合到过滤器中,但是暂时没有运气。 我希望他们一起努力。 喜欢: 当我写一个单词时,如果从其他过滤器中有任何选择,它应该过滤它。 或者,当我使用类别过滤器进行过滤时, ...

7 使用指定的搜索关键字过滤表

我有一个表,我是根据单元格值自动过滤的。 我要面对的问题是,除非单元格值匹配的过滤器不起作用。 例如,在我的表中,我在第3列中有mothercare ,但是我希望我的用户仅能够搜索例如mother 。 我觉得这很简单,我很想念 ...

8 使用特定搜索关键字作为过滤器的策略

我正在使用Elasticsearch改进我的食物菜单的搜索功能。 分析表明,我们的用户经常在搜索栏中输入食物“类别”,例如sandwich , soup等。此外,人们在输入诸如gluten free东西。 有哪些策略可以将这些“元”级别的搜索词转化为过滤器而不是查询词? 我的想法是 ...

9 如何在Swift中使用关键字过滤搜索

我已经知道使用类别来过滤快速表中的搜索,我正在寻找一种可能在一个特定搜索中有多个关键词的过滤搜索。 目前,我的课程如下: 据我了解,如果我为标签使用单个字符串,则可以创建搜索类别,但是在这种情况下,会有多个标签(例如“教程”,“建议”等。) 如何根据用户键入的关键字创建一个搜 ...

2017-10-17 21:42:45 2 86   swift
10 过滤带有或的关键字

我想根据多个条件过滤我的制表符表(文档http://tabulator.info/docs/4.5/filter#search-data )并为此创建了以下函数: 当我运行该函数时,tabulator 只显示与我的过滤器table.setFilter("type", "like", "keywo ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM