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!

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

相关推荐
To_OC6 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC7 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn7 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿9 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen10 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
gis开发之家15 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码
橘子星16 小时前
我一个前端切图仔,凭什么能在浏览器里跑大模型?
前端·javascript·前端框架
半个落月16 小时前
用 LangChain JS 做可控写作实验:理解温度参数、提示词与异步调用
javascript·人工智能·后端
观远数据16 小时前
Excel到数据资产池:文件数据入湖的治理规范怎么建
前端·javascript·excel