vue实现搜索高亮关键字

模仿浏览器中ctrl+f实现搜索关键字 高亮显示
思路:

  1. 通过ref获取dom元素
  2. 删除当前关键词高亮色;
  3. 设置本次搜索的关键词高亮;
  4. 进行内容替换;
  5. 为首个关键词进行高亮,设置为当前关键词;

关键代码:

  1. 定义一个正则 key就代表要高亮的字符串,i 代表匹配大小写 g代表全局匹配
  2. 利用 字符串的replace方法进行替换,把匹配的关键字进行替换 进行包裹
  3. 正则语法: str.replace(正则,( 匹配到内容 )=>{ return 要替换的内容 })
 // 获取对应的dom元素
    const main = this.$refs[`checkboxOpposite${key}`][0].$el as any;

    let innerHTML = main.innerHTML;
    //删除当前关键词的背景色
    const emReg1 = new RegExp('<em style="background-color: yellow">', 'g');
    innerHTML = innerHTML.replace(emReg1, '');
    const emReg2 = new RegExp('</em>', 'g');
    innerHTML = innerHTML.replace(emReg2, '');
    const emReg3 = new RegExp('<strong style="background-color: #ff9632">', 'g');
   	innerHTML = innerHTML.replace(emReg3, '');
    const emReg4 = new RegExp('</strong>', 'g');
    innerHTML = innerHTML.replace(emReg4, '');
    // ------
    main.innerHTML = innerHTML;
    // 设置本次搜索背景色
    if (value !== '' && value !== ' ') {
      设置本次搜索背景色;
      const reg = new RegExp(value, 'g');
      const mainInnerHTML = innerHTML.replace(new RegExp('(?=\>).+?(?=\<)', 'g'), function (str) {
        const reg1 = new RegExp('(?=>).+', 'g');
        return str.replace(new RegExp('(>).+', 'g'), function (str2) {
          return str2.replace(reg1, function (str1) {
            return str1.replace(reg, '<em style="background-color: yellow">' + value + '</em>');
          });
        });
      });
      main.innerHTML = mainInnerHTML;
    }
    // em标签都是被替换的 所以em标签的数量就是搜索到关键字的数量 为首个关键词进行高亮,设置为当前关键词;
    // const num = document.getElementsByTagName('em').length;
    // if (num !== 0) {
    //   document.getElementsByTagName('em')[0].innerHTML =
    //     '<strong style="background-color: #ff9632">' + value + '</strong>';
    //   // 滚动到第一个关键字位置
    //   document.getElementsByTagName('em')[0].scrollIntoView({
    //     block: 'start',
    //     behavior: 'smooth',
    //   });
    // }

参考链接

但是上方适用于段落这种操作,如果是和饿了么的下拉框等组件配合使用的话,就有些不行, 不能点击checkbox【起码我没想到方法,有大佬想到方法,可以一起交流】

所以基于饿了么的我又想了一个办法,配合使用v-html
我这里是checkbox的例子,我们获取到options,对options的每一个进行操作,如果匹配符合的话给他设置背景

formOptions是很多多选框组成的数组,我需要替换到搜索的那一组多选框的options即可

 private threeFormChange(value: string, searchItem: any) {
    if (searchItem.options && searchItem.options.length > 0) {
      searchItem.options.filter(item => {
        const reg = new RegExp(value, 'g');
        const replaceString = `<span style="background-color: yellow">${value.trim()}</span>`;
        item.htmlLabel = null;
        if (item.label.match(reg) && value) {
          item.htmlLabel = item.label.replace(reg, replaceString);
          return item;
        }
      });
      this.formOptions.splice(
        this.formOptions.findIndex(item => item.prop === searchItem.prop),
        1,
        {
          ...searchItem,
          options: searchItem.options
        }
      );
    }
  }

html代码

 <el-checkbox-group v-model="bindValue" v-on="$listeners">
    <el-checkbox-button
      v-for="(item, index) in options"
      :key="index"
      :label="item.value"
      :disabled="item.disabled ? item.disabled : false"
      :checked="item.checked ? item.checked : false"
      :class="item.class ? item.class : ''"
    >
      <span v-show="!item.htmlLabel">{{ item.label }}</span>
      <div v-show="item.htmlLabel" v-html="item.htmlLabel"></div>
    </el-checkbox-button>
  </el-checkbox-group>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值