楼主: zxit666
2387 0

Taro@3.3.3最新版本开发企业级出行项目 [推广有奖]

  • 0关注
  • 0粉丝

高中生

30%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0138
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
140 点
帖子
12
精华
0
在线时间
9 小时
注册时间
2022-3-9
最后登录
2022-8-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
### Taro@3.3.3最新版本开发企业级出行项目前端完成搜索并高亮文字的两种方式
在做文字处置的项目时经常会遇到搜索文字并高亮的需求,常见的完成方式有插入标签和贴标签两种。这两种方式适用于不同的场景,各有优劣。为了便当操作,直接起一个Vue项目,在里面演示。
插入标签的方式简单做一个规划,handleSearch 中放主要逻辑
<script setup>import { ref } from 'vue'const text = ref('豫章故郡,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。雄州雾列,俊采星驰。台隍枕夷夏之交,宾主尽东南之美。都督阎公之雅望,棨戟遥临;宇文新州之懿范,襜帷暂驻。十旬休假,胜友如云;千里逢迎,宾客盈门。腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库。家君作宰,路知名区;童子何知,躬逢胜饯。')const search = ref('')const handleSearch = () => {  console.log(search.value)}</script><template>  <div class="editor">{{ text }}</div>  <input type="text" v-model="search">  <button @click="handleSearch">搜索</button></template><style scoped>.editor {  width: 200px;  height: 200px;  border: 1px solid #ddd;  overflow: auto;}</style>复制代码补充 handleSearch 的处置逻辑:
const handleSearch = () => {  const regExp = new RegExp(search.value, 'g')  text.value = text.value.replace(regExp, `${search.value}`)}复制代码用输入框中的内容创立一个正则,然后将内容做交换,外面裹上 span 标签并加背景颜色。
对 editor 稍作修正,否则标签渲染不出来
<div class="editor" v-html="text"></div>

贴标签的方式这种方式需求两个前置的学问储藏,一个是 Document.createRange() ,该办法用以创立一个包含节点与文本节点的一局部的文档片段。另一个是 Range.getBoundingClientRect() ,固然是一个实验中的办法,但是主流阅读器根本都支持,该办法会返回一个 DOMRect 对象,包含8个属性,文档中有细致的引见,在此就不赘述了。
对页面稍作修正:
<script setup>import { ref, watch, onMounted } from 'vue'const text = ref('豫章故郡,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。雄州雾列,俊采星驰。台隍枕夷夏之交,宾主尽东南之美。都督阎公之雅望,棨戟遥临;宇文新州之懿范,襜帷暂驻。十旬休假,胜友如云;千里逢迎,宾客盈门。腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库。家君作宰,路知名区;童子何知,躬逢胜饯。')const search = ref('')const highlight = ref([])const editorRef = ref(null)const wrapperRef = ref(null)const handleSearch = () => {  }</script><template>  <div class="container">    <div class="wrapper" ref="wrapperRef">      <div class="editor" ref="editorRef" contenteditable>{{ text }}</div>      <div class="highlight"></div>    </div>  </div>  <input type="text" v-model="search">  <button @click="handleSearch">搜索</button></template><style scoped>.container {  width: 200px;  height: 200px;  border: 1px solid #ddd;  overflow: auto;}.wrapper {  position: relative;}.highlight {  position: absolute;  width: 100%;  height: 100%;  left: 0;  top: 0;  z-index: -1;}</style>复制代码增加了一个 highlight 框,用来寄存高亮的块, highlight 数组用来寄存需求高亮的块的位置信信息。
补充搜索函数中的逻辑
const len = search.value.lengthconst regExp = new RegExp(search.value, 'g')const textNode = editorRef.value.firstChildlet result = nullwhile (result = regExp.exec(text.value)) {  const { index } = result  const range = document.createRange()  range.setStart(textNode, index)  range.setEnd(textNode, index + len)  const rangeReact = range.getBoundingClientRect()  highlight.value.push(rangeReact)}

download链接:https://pan.baidu.com/s/1uazZpyH_m2LCaWBg5Pgq-Q?pwd=n0az
提取码:n0az
--来自百度网盘超级会员V4的分享



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:最新版本 最新版 新版本 企业级 ARO

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 06:48