Vue关键词搜索高亮

有时候给页面内容添加一个关键词搜索功能,如果搜索结果能够像浏览器搜索一样高亮显示,那找起来就会很明显体验会好很多。本文就介绍一下关键词搜索高亮的实现方案。

实现效果大概如下:

可在线预览:http://wintc.top/laboratory/#/search-highlight。

一、实现原理

实现原理很简单:
使用正则匹配出文本内容中的所有关键词,在关键词外包一层内联标签,比如span或者font,通过innerHtml渲染文本。使用CSS控制插入的内联元素样式,并且记录下当前搜索到的结果是第几个,使用不同的样式来展示。

比如文本内容是“江畔何人初见月?江月何年初照人?”,而关键词是“月”,那替换后的字符串可能变为:

江畔何人初见<font style="background: #ff9632">月</font>?江<font style="background: #ffff00">月</font>何年初照人?

其中匹配的“月”被替换成了<font>月</font>,并且设置font标签的背景色,使得搜索到的第一个“月”(当前关键词)背景变为橘黄色,而第二个“月”背景变为黄色。

本文基于Vue实现了一个组件,并且将组件发布到了npm上,如果你不想自己写组件,可以直接安装使用:vue-search-highlight。
接下来会介绍一下组件vue-search-highlight的使用,然后给出Vue中的搜索高亮的代码实现。

二、vue-search-highlight组件使用

组件需要传入文本content以及关键词keyword,组件会渲染出一个包含content并且关键词被font元素替换的div元素。
组件功能如下:

  • 关键词高亮

  • 关键词匹配总数以及当前关键词的索引(即是第几个搜索结果)

  • 查找上一个、下一个功能,调用相应函数即可跳到上一个或者下一个

使用方法:

1、安装组件,使用npm或者yarn

// 如果使用yarn
yarn add vue-search-highlight
// 如果使用npm
npm install vue-search-highlight

2、引入
vue-search-highlight本身是一个组件,在需要搜索高亮的页面里引入后,像正常的组件一样使用即可。


import SearchHighlight from 'vue-search-highlight'
// 注册为子组件
components: {'search-highlight': SearchHighlight
},

1)、props

2)、events
组件有两个重要的数据,即搜索匹配数量和当前关键词索引,会通过$emit弹射出来,如果需要展示搜索索引和匹配总数(比如 3 / 16),你可以监听组件的这两个事件:

3)、methods
你可以通过ref引用组件,直接调用组件内部的一些方法:

使用示例:


<search-highlightclass="search-highlight"ref="search"@current-change="currentChange"@mactch-count-change="matchCountChange":content="content":keyword="keyword">
</search-highlight><script>
import SearchHighlight from 'vue-search-highlight'export default {components: {SearchHighlight},data () {return {currentIdx: 0,matchCount: 0,keyword: '月',content: `春江花月夜[唐] 张若虚春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明!江流宛转绕芳甸,月照花林皆似霰;空里流霜不觉飞,汀上白沙看不见。江天一色无纤尘,皎皎空中孤月轮。江畔何人初见月?江月何年初照人?人生代代无穷已,江月年年望相似。不知江月待何人,但见长江送流水。白云一片去悠悠,青枫浦上不胜愁。谁家今夜扁舟子?何处相思明月楼?可怜楼上月徘徊,应照离人妆镜台。玉户帘中卷不去,捣衣砧上拂还来。此时相望不相闻,愿逐月华流照君。鸿雁长飞光不度,鱼龙潜跃水成文。昨夜闲潭梦落花,可怜春半不还家。江水流春去欲尽,江潭落月复西斜。斜月沉沉藏海雾,碣石潇湘无限路。不知乘月几人归,落月摇情满江树。`,}},methods: {searchNext () {this.$refs.search.searchNext()},searchLast () {this.$refs.search.searchLast()},matchCountChange (count) {this.matchCount = count},currentChange (idx) {this.currentIdx = idx},checkKeydown (event) {if (event.shiftKey) {this.searchLast()} else {this.searchNext()}}}
}
</script>

三、组件代码实现

vue-search-highlight组件代码如下:

<template><div class="search-highlight" v-html="contentShow"></div>
</template><script>
const CLASS_NAME = 'search-hightlight'export default {props: {content: {type: String,default: ''},keyword: {type: String,default: ''},highlightStyle: {type: String,default: 'background: #ffff00'},currentStyle: {type: String,default: 'background: #ff9632'}},data () {return {lightIndex: 0,matchCount: 0}},computed: {contentShow () {if (!this.keyword) return this.contentlet reg = new RegExp(this.keyword, 'g')let stringList = this.content.split(reg)if (!stringList.length) return this.contentlet content = ''for (let i = 0; i < stringList.length - 1; i++) {let style = i === this.lightIndex ? this.currentStyle : this.highlightStylecontent += `${stringList[i]}<font style="${style}" ${CLASS_NAME}>${this.keyword}</font>`}content += stringList[stringList.length - 1]return content}},watch: {keyword: {immediate: true,handler () {this.lightIndex = 0this.getMatchCount()}},lightIndex: {immediate: true,handler () {this.$emit('current-change', this.lightIndex)}},matchCount: {immediate: true,handler () {this.$emit('mactch-count-change', this.matchCount)}}},methods: {scrollTo (index) {this.$nextTick(() => {let list = this.$el.querySelectorAll(`font[${CLASS_NAME}]`)if (list[index]) {this.lightIndex = indexlist[index].scrollIntoView()}})},searchNext () {this.$nextTick(() => {let idx = this.lightIndex >= this.matchCount - 1 ? 0 : this.lightIndex + 1this.scrollTo(idx)})},searchLast () {this.$nextTick(() => {let idx = this.lightIndex <= 0 ? this.matchCount - 1 : this.lightIndex - 1this.scrollTo(idx)})},getMatchCount () {this.$nextTick(() => {let list = this.$el.querySelectorAll(`font[${CLASS_NAME}]`)this.matchCount = list.length})},}
}
</script>

Vue关键词搜索高亮相关推荐

  1. vue实现搜索高亮关键字

    模仿浏览器中ctrl+f实现搜索关键字 高亮显示 思路: 通过ref获取dom元素 删除当前关键词高亮色: 设置本次搜索的关键词高亮: 进行内容替换: 为首个关键词进行高亮,设置为当前关键词: 关键代 ...

  2. 搜索关键字高亮_SpringBoot+Mybatis-Plus+Elasticsearch 实现关键字搜索高亮展示

    一.概述&介绍 Elasticsearch:Elasticsearch 是基于Lucense 技术的搜索引擎(服务器),将数据进行缓存再进行查询.​ 与数据库查询的比较:​ (1)相当于sql ...

  3. vue中搜索关键词,使文本标红

    UserHead.vue中搜索框: <!-- 搜索 --><el-col :span="6" :offset="8" class=" ...

  4. Mr.J--Javascript表格创建 模糊搜索 关键词搜索

    本文章主要是了解js制作表格,不过现在前端一般都是用div+CSS布局,所以有兴趣的可以了解一下这种思想.在我们现实生活中表格是非常普遍的,也是非常好用的,现在我们有Excel,Word,WPS也可以 ...

  5. linux vim 高亮查找,vim搜索高亮关键字怎么取消,vim查询高亮搜索显示如何清除取消...

    如果我们在在打开的文件中使用Vim搜索功能并开启搜索高亮显示后怎么取消当前高亮显示搜索关键字呢? vim搜索高亮关键字如何取消,vim清除查询高亮搜索显示的方法 下面站长为大家介绍vim搜索高亮关键字 ...

  6. [No000018C]Vim清除上次的搜索高亮结果-Vim使用技巧(1)

    在打开文件中使用Vim搜索功能并开启高亮显示后怎么取消当前高亮显示的目标词? 最简单的方法是再使用Vim搜索一串文档中不存在的目标词来覆盖当前高亮的搜索结果. 其实,可以在Vim尾行模式下使用 :no ...

  7. 输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流

    输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流 参考文章: (1)输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue ...

  8. vue项目搜索历史功能的实现

    vue项目搜索历史功能的实现 播放器项目中歌曲搜素页面的 首先需要在state定义搜索历史,在其中保存搜索历史 state.js:<br>// 搜索历史: searchHistory: [ ...

  9. mac版sublime 无法下载插件(Vue 代码无高亮问题)

    1.官方下载sublime(http://www.sublimetext.com/3) 然后需要两步(1)上传插件主包Package Control(2)更改channels的配置信息(原来是国外的需 ...

  10. sublime存模板_Sublime Text新建.vue模板并高亮

    准备工作下载安装新建文件模板插件 SublimeTmpl 下载安装vue语法高亮插件 Vue Syntax Highlight Sublime Text安装插件的方法有两种:使用Sublime Tex ...

最新文章

  1. JS报“Uncaught TypeError: undefined is not a function ”异常
  2. Python+Appium自动化测试之toast定位
  3. Firefox 插件:鲜味 del.icio.us,和朋友分享你的收藏
  4. 如何在vue中使用图形验证码
  5. 前端学习(2546):debugger
  6. django的url控制系统
  7. 【Elasticsearch】elasticsearch 常用 API 介绍
  8. 电脑无法检查计算机更新,安装win7系统弹出错误提示无法检查更新的方法
  9. [Java] 蓝桥杯ALGO-111 算法训练 明明的随机数
  10. 使用VMM2008 R2管理Hyper-V之1-实验环境与VMM 2008安装
  11. 三星s4i9500+android4.2.2基带,【教程扫盲】S4该如何选择基带和底包[转自机锋]
  12. Java开发手册 Java学习手册教程(MtJava开发手册)
  13. MonkeyTest脚本
  14. 金句: 對比MBA學位,我們更需要PSD學位的人! Poor, Smart and Deep Desire to… | consilient_lollapalooza on Xanga...
  15. OSS定制自定义response header
  16. 视频教程-HoloLens与ARcore第三视角开发-其他
  17. 【快应用】菜单遮挡内容?教你一招快速搞定!
  18. 2018年蓝桥杯C语言B组
  19. 什么高大填空四个字动人_照样子填空填四字成语什么什么什么地想
  20. python光棍节快乐_2020年光棍节快乐的祝福语10句

热门文章

  1. Android UI设计之十自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
  2. JavaScript——用键盘wasd控制div移动
  3. 基于x86汇编的飞机大战
  4. spring boot实现图片裁剪
  5. Android12前台服务问题
  6. 计算机社团英语宣传海报,英语协会宣传海报
  7. gradle启动项目编译报错:Executing task ‘clean‘...Task execution finished
  8. 精品餐饮业奢华西餐专业PPT-朴尔PPT
  9. 【jdk1.8特性】之Function
  10. PBR 前言 颜色理论:色度、色域与色彩空间