js原生实现搜索框下拉列表输入框模糊匹配高亮

1、需求

很多搜索列表输入框,输入下拉列表有的文字时做模糊匹配,进行相关文字高亮,(比如需要输入的任意一个字有,列表中对应的那个字就得高亮,不是需要跟输入框的字完全一样 )

2、实现效果:

3、实现方法:

原理就是给特定需要高亮的文字加个class样式,生成一个模版字符串。

注意:我这里是vue所以用v-html解析模版字符串,如果是reactdangerouslySetInnerHTML即可

3.1、正则:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
const renderSuggest = (suggest: string, highlight) => {
    if (highlight) {
      let suggestHighlight = suggest;
      const highlightStrs = highlight?.split("").join("|") || "";
      try {
        suggestHighlight = suggestHighlight.replace(
          new RegExp(`(${highlightStrs})`, "g"),
          `<i class="highlight-tag">$1</i>`
        );
      } catch (e) {
        console.log("suggest error", e);
      }
    }
    return  <div v-html=`${suggestHighlight}` ></div>
  };

// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

3.2、工具方法

第一种:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
while (index !== -1) {
    // 添加非高亮部分
    suggestHighlight += suggest.substring(currentIndex, index);

    // 添加高亮部分
    suggestHighlight += `<i class="highlight-tag">${highlight}</i>`;

    // 更新当前索引到已找到的高亮部分之后
    currentIndex = index + highlight.length;

    // 继续查找下一个高亮部分
    index = suggest.indexOf(highlight, currentIndex);
}

// 添加剩余的非高亮部分
suggestHighlight += suggest.substring(currentIndex);


// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

第二种:

suggest: 字符串原文
highlight: 需高亮文字 (比如可以是你的输入框value)
suggestHighlight: 字符串原文包含highlight的加上高亮样式后的html

typescript 复制代码
const renderSuggest = (suggest: string, highlight: string) => {
    let suggestHighlight = '';

    for (let i = 0; i < suggest.length; i++) {
        const currentChar = suggest[i];
        const isHighlighted = highlight.includes(currentChar);

        // 如果当前字符需要高亮
        if (isHighlighted) {
            suggestHighlight += `<i class="highlight-tag">${currentChar}</i>`;
        } else {
            suggestHighlight += currentChar;
        }
    }

    return  <div v-html="suggestHighlight" ></div>
};

// 别忘记定义高亮class
.highlight-tag {
 	color: red;
 }

end!

希望记录的问题能帮助到你~

相关推荐
小兵张健11 小时前
开源 playwright-pool 会话池来了
前端·javascript·github
codingWhat15 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
Lee川15 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
进击的尘埃15 小时前
Web Worker 与 OffscreenCanvas:把主线程从重活里解放出来
javascript
codingWhat15 小时前
手撸一个「能打」的 React Table 组件
前端·javascript·react.js
进击的尘埃15 小时前
用 TypeScript 的 infer 搓一个类型安全的深层路径访问工具
javascript
yuki_uix15 小时前
Object.entries:优雅处理 Object 的瑞士军刀
前端·javascript
Lee川15 小时前
JavaScript 面向对象编程全景指南:从原始字面量到原型链的终极进化
javascript·面试
Neptune119 小时前
JavaScript回归基本功之---类型判断--typeof篇
前端·javascript·面试
进击的尘埃20 小时前
微前端沙箱隔离:qiankun 和 wujie 到底在争什么
javascript