美文网首页前端100问
【前端100问】Q90:实现模糊搜索结果的关键词高亮显示

【前端100问】Q90:实现模糊搜索结果的关键词高亮显示

作者: alanwhy | 来源:发表于2021-02-24 17:06 被阅读0次

    写在前面

    此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
    为了备战 2021 春招
    每天一题,督促自己
    从多方面多角度总结答案,丰富知识
    实现模糊搜索结果的关键词高亮显示
    简书整合地址:前端 100 问

    正文回答

    q90-1.jpg

    考虑节流、缓存。其实还可以上列表diff+定时清理缓存

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>auto complete</title>
      <style>
        bdi {
          color: rgb(0, 136, 255);
        }
    
        li {
          list-style: none;
        }
      </style>
    </head>
    <body>
      <input class="inp" type="text">
      <section>
        <ul class="container"></ul>
      </section>
    </body>
    <script>
    
      function debounce(fn, timeout = 300) {
        let t;
        return (...args) => {
          if (t) {
            clearTimeout(t);
          }
          t = setTimeout(() => {
            fn.apply(fn, args);
          }, timeout);
        }
      }
    
      function memorize(fn) {
        const cache = new Map();
        return (name) => {
          if (!name) {
            container.innerHTML = '';
            return;
          }
          if (cache.get(name)) {
            container.innerHTML = cache.get(name);
            return;
          }
          const res = fn.call(fn, name).join('');
          cache.set(name, res);
          container.innerHTML = res;
        }
      }
    
      function handleInput(value) {
        const reg = new RegExp(`\(${value}\)`);
        const search = data.reduce((res, cur) => {
          if (reg.test(cur)) {
            const match = RegExp.$1;
            res.push(`<li>${cur.replace(match, '<bdi>$&</bdi>')}</li>`);
          }
          return res;
        }, []);
        return search;
      }
      
      const data = ["上海野生动物园", "上饶野生动物园", "北京巷子", "上海中心", "上海黄埔江", "迪士尼上海", "陆家嘴上海中心"]
      const container = document.querySelector('.container');
      const memorizeInput = memorize(handleInput);
      document.querySelector('.inp').addEventListener('input', debounce(e => {
        memorizeInput(e.target.value);
      }))
    </script>
    </html>
    

    相关文章

      网友评论

        本文标题:【前端100问】Q90:实现模糊搜索结果的关键词高亮显示

        本文链接:https://www.haomeiwen.com/subject/dwisfltx.html