js搜索关键字,并高亮显示

简介: js搜索关键字,并高亮显示

当我们搜索时,总想要自己输入的字体显示为重点,今天我为大家解决这个问题

    <!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>搜索关键字高亮</title>
  </head>
  <style type="text/css">
    .fonthighlight {
      color: red;
      font-weight: 600;
      font-size: 16px;
    }
    input {
      height: 25px;
      width: 300px;
      padding: 0;
      margin: 0;
    }
    button {
      padding: 0;
      margin: 0;
      height: 30px;
      width: 80px;
      background-color: orange;
      border: none;
    }
    button:hover {
      color: red;
      background-color: #00aaff;
    }
    ul {
      padding-left: 5px;
      margin-top: 5px;
      width: 300px;
      background-color: #efefef;
      border: #F0F0F0 solid 2px;
      border-radius: 0.2rem;
      display: none;
    }
    ul li {
      list-style-type: none;
      text-align: left;
      padding: 0;
      margin-top: 5px;
    }
    ul li:hover {
      background-color: #c7c7c7;
      cursor: pointer
    }
  </style>
  <body>
    <div>
      <input placeholder="请输入搜索关键字..." type="text" name="" id="searchResult" value="" />
      <button type="button" onclick="onSearch()">搜索</button>
      <ul id="associate"></ul>
    </div>
    <script>
      // 解决动态生成元素无法绑定事件
      // @param {Object} type 事件类型
      // @param {Object} fun 回调函数
      Element.prototype.on = function(type, fun) {
        window.addEventListener ? this.addEventListener(type, fun) : this.attachEvent('on' + type, fun);
      }
      let globalSearchKey = ''
      let associate = document.querySelectorAll("#associate")[0];
      function bindEvent(associateChildNodes, event) {
        for (let i = 0; i < associateChildNodes.length; i++) {
          associateChildNodes[i].on(event, function() {
            let matchNods = this.childNodes;
            if (matchNods && matchNods.length > 0) {
              for (let i = 0; i < matchNods.length; i++) {
                globalSearchKey += matchNods[i].innerHTML;
              }
            }
            console.log("选项被点击:", this.childNodes);
            document.getElementById("searchResult").value = globalSearchKey.trim();
            globalSearchKey = '';
            console.log("globalSearchKey", globalSearchKey)
            // associate.style.display = 'none';
            associate.style.visibility = 'hidden';
          });
        }
      }
      // 想法:把包含搜索关键字的位置分四种情况考虑:
      // 1.没有找到匹配到搜索关键字,直接返回原字符串
      // 2.搜索关键字在头部
      // 3.搜索关键字在尾部
      // 4.搜索关键字在中间
      // 搜索关键字高亮
      // @param {Object} source 原字符串[搜索结果]
      // @param {Object} target 子字符串[搜索关键字]
      function highlightText(source, target) {
        if (!source || !target) {
          return '';
        } else {
          let indexPosition = source.indexOf(target)
          if (indexPosition != -1) {
            let sourceLength = source.length;
            let prefix = source.substring(0, indexPosition);
            let suffixIndex = (prefix ? prefix.length : 0) + (target ? target.length : 0);
            let suffix = source.substring(suffixIndex, sourceLength);
            if (indexPosition == 0) {
              return `<span class="fonthighlight target">${target}</span><span class="suffix">${suffix}</span>`;
            } else if (indexPosition + target.length == source.length) {
              return `<span class="prefix">${prefix}</span><span class="fonthighlight target">${target}</span>`;
            } else {
              return `<span>${prefix}</span><span class="fonthighlight target">${target}</span><span>${suffix}</span>`;
            }
          } else {
            return `<span>${source}<span/>`;
          }
        }
      }
      // 联想数据
      let shading = [
        '你真好看',
        '你真帅',
        '你太美丽了',
        '你长到姐的审美标准上了',
        '我想你了',
        '可是....我真的好想你啊'
      ];
      function onSearch() {
        let currentSearchKey = document.getElementById("searchResult").value;
        if (!currentSearchKey) {
          alert("搜索关键字不能为空!")
        }
        alert("当前搜索关键字:" + currentSearchKey);
        // associate.style.display = 'none';
        associate.style.visibility = 'hidden';
      }
      let dom = document.getElementById("searchResult");
      // 输入框值改变匹配关键字高亮[底纹数据可换成联想数据]
      dom.oninput = (event) => {
        if (!event.target.value) {
          associate.innerHTML = '<li>暂无匹配数据!</li>';
          return;
        }
        let matchHtml = '';
        shading.forEach((item, index, slef) => {
          let matchResultText = highlightText(item, event.target.value);
          matchHtml += (`<li>` + matchResultText + "</li>");
        });
        associate.innerHTML = matchHtml;
        // 重新渲染一定要重新绑定事件
        let associateChildNodes = associate.childNodes;
        bindEvent(associateChildNodes, 'click');
      }
      // 输入获得焦点[获取底纹数据]
      dom.onfocus = (event) => {
        hint();
      }
      // 输入失去焦点
      dom.onblur = (event) => {
        console.log("失去焦点")
      }
      // 获得焦点是提示的底纹
      function hint() {
        let associateHtml = '';
        shading.forEach((item, index, slef) => {
          associateHtml += `<li ><span >${item} </span></li>`;
        });
        associate.innerHTML = associateHtml;
        associate.style.display = 'block';
        let associateChildNodes = associate.childNodes;
        associate.style.visibility = 'visible';
        // 绑定事件 
        bindEvent(associateChildNodes, 'click');
      }
    </script>
  </body>
</html>

这个问题如果可以解决您们的麻烦还请点个关注,Thanks♪(・ω・)ノ

目录
相关文章
|
1月前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
26 5
|
1月前
|
前端开发 JavaScript 开发者
除了 async/await 关键字,还有哪些方式可以在 JavaScript 中实现异步编程?
【10月更文挑战第30天】这些异步编程方式在不同的场景和需求下各有优劣,开发者可以根据具体的项目情况选择合适的方式来实现异步编程,以达到高效、可读和易于维护的代码效果。
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
3月前
|
JavaScript 前端开发 Java
JavaScript 保留关键字
JavaScript 保留关键字
23 2
|
3月前
|
JavaScript 前端开发
JavaScript this 关键字
JavaScript this 关键字
17 1
|
4月前
|
JavaScript 前端开发
JavaScript 语句标识符(关键字)
【8月更文挑战第29天】
27 5
|
4月前
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
275 4
|
4月前
|
JavaScript 前端开发
|
4月前
|
JavaScript 前端开发 安全
前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密
前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密
133 0
|
4月前
|
前端开发 JavaScript 开发者
fuse.js前端搜索简单使用的三个案例
通过这三个例子可以看出,Fuse.js 是一个功能丰富、易于实现的前端搜索库。它使开发者能够便捷地实现从基础到高级的搜索功能,无论是简单的列表搜索还是实时的搜索建议,都能够高效、精确地提供给用户所需的信息。
234 0