记录--前端实现点击选词功能

news2024/12/27 13:04:26

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

今天有一个需求,点击选中某个英文单词,然后对这个单词做一些处理,例如高亮背景、查看一些详细信息等等,今天简单实现了一下,效果如下:(支持移动端,chrome和sarafi浏览器均能正常使用。语言🚀 vue3 + typescript)

highlight.gif

选词

由于要动态添加给某些单词动态添加一些标签,我们这里可以考虑使用v-html

首先我们先编写一下简单的结构

<script setup lang="ts">
</script>

<template>
  <div class="container" v-html="shortArticle"></div>
</template>

  
<style>
.container {
  font-size: 18px;
}
</style>

然后,我们将需要处理的短文变换为span标签包裹,这里的思路是按照空格划分,然后添加span结构,最后拼接到一起返回。这里有一些边缘条件要考虑,比如can't(whichyes!等等,按照空格划分出来的数据有一点问题。

如果不做处理的话,一些标点符号也会高亮出来,就不太正确了。下面是处理逻辑,整体比较简单,就不解释了。

function addElementSpan(str: string): string {
  return str
    .split(' ')
    .map((item) => {
      const { start, word, end } = getWord(item)
      return `${start}<span>${word}</span>${end} `
    })
    .join('')
}

function getWord(str: string) {
  let word = ''
  let start = ''
  let end = ''
  let j = str.length - 1
  let i = 0

  while (i < str.length) {
    if (/^[a-zA-Z]$/.test(str[i])) {
      break
    }
    start = start + str[i]
    i += 1
  }

  while (j >= 0) {
    if (/^[a-zA-Z]$/.test(str[j])) {
      break
    }
    end = str[j] + end
    j -= 1
  }

  word = str.slice(i, j + 1)

  // 处理数字
  if (!word && start === end) {
    start = ''
  }

  return {
    start,
    word,
    end
  }
}

现在我们来实现效果

<script setup lang="ts">
import { computed } from 'vue'
import { addElementSpan } from './utils'

const str = `It works fine if you move the navbar outside the header. See below. For the reason, according to MDN: The element is positioned according to the normal flow of the document, and then offset
    relative to its flow root and containing block based on the values of top, right, bottom, and
    left. For the containing block: The containing block is the ancestor to which the element is
    relatively positioned So, when I do not misunderstand, the navbar is positioned at offset 0
    within the header as soon as it is scrolled outside the viewport (which, clearly, means, you
    can't see it anymore).`

const shortArticle = computed(() => {
  return addElementSpan(str)
})

function setColor(event: any) {
  // console.log(event.target.innerText) 获取选中的文本
  event.target?.classList.add('word_highlight')
}
</script>

<template>
  <div class="container" @click="setColor($event)" v-html="shortArticle"></div>
</template>

<style>
.word_highlight {
  background-color: red;
}
</style>

在父亲元素上添加点击事件,触发事件点击之后,调用setColor函数,高亮背景(添加class)

不过有一点小小的问题,点击div的空白区域或者非英文单词区域会直接整个背景变成红色,控制台打印event.target.innerText可以发现它的值为整个文本,所以我们可以根据判断打印的文本长度和需要设置的文本长度是否一致来解决这个问题。(ps:⬆️面的示例代码str字符串使用了反引号 模板字符串 ,直接使用下面会影响结果)

function setColor(event: any) {
  // console.log(event.target.innerText)
  if(str !== event.target.innerText){
    event.target?.classList.add('word_highlight')
  }
}

对于event.target不太了解的伙伴可以看这篇文章 ➡️ Event.target - Web API 接口参考 | MDN (mozilla.org)

(和event.target类似的还有一个属性event.currentTarget,不太了解的伙伴可以看下这篇文章 ➡️ Event.currentTarget - Web API 接口参考 | MDN (mozilla.org),它俩的区别是event.target指的是事件触发的元素,而event.currentTarget指的是事件绑定的元素)

功能拓展

这里只是演示了一下比较简单的背景高亮效果,有需求的伙伴可以自己拓展一下。

比如类似于掘金的拼写错误提示框

 如果要实现滑动选词的话,可以参考这个博主的文章 ➡️ 鼠标选中文本划词高亮、再次选中划词取消高亮效果

本文转载于:

https://juejin.cn/post/7223733256688025661

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM-6B本地cpu部署

ChatGLM-6B是清华团队研发的机器人对话系统&#xff0c;类似ChatGPT&#xff0c;但是实际相差很多&#xff0c;可以当作一个简单的ChatGPT。 ChatGLM部署默认是支持GPU加速&#xff0c;内存需要32G以上。普通的机器无法运行。但是可以部署本地cpu版本。 本地部署&#xff0c;需…

ePWM模块(3)

比较模块 CMPA:比较寄存器A,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPB:比较寄存器B,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPCTL:控制寄存器(重要) SHDWAFULL(或SHDWBFULL):CMPA(或B)阴影寄存器满标志位 0:未满 1:满了 SHDWAMODE(或…

【致敬未来的攻城狮计划】— 连续打卡第二十六天:瑞萨RA Cortex-M 内核RA2E1 RT-Thread BSP 启蒙知识

系列文章目录 由于一些特殊原因&#xff1a; 系列文章链接&#xff1a;&#xff08;其他系列文章&#xff0c;请点击链接&#xff0c;可以跳转到其他系列文章&#xff09;或者参考我的专栏“ 瑞萨MCU ”&#xff0c;里面是 瑞萨RA2E1 系列文章。 24.RA2E1的 DMAC——数据传输 …

Ubuntu设置静态IP地址的方法

今天重装了ubuntu22.04server系统&#xff0c;顺便将Ip方法的配置方法记录下&#xff0c;备存。 步骤1&#xff1a;先ifconfig查看电脑的网卡信息 找到物理网卡的名称&#xff0c;我这里是enp3s0 步骤2&#xff1a;找到gateway网关地址 输入route -n命令&#xff0c;打印路由…

数据知识驱动的城市作战元宇宙建模框架

源自&#xff1a;指挥与控制学报 作者&#xff1a;郑文博 李强 刘文礼 费爱国 王飞跃 摘 要 1 相关工作与问题提出 2 新型元宇宙框架的构建 图 1 平行智能与元宇宙 图2 数据知识驱动的城市作战元宇宙建模框架 3 案例设计 3.1 基于生成式对抗网络的表现力改进设计 图…

开关电源基础06:基本开关电源电感能量传输原理

说在开头&#xff1a;关于第六届索尔维会议&#xff08;1&#xff09; 1930年&#xff0c;第六届的索尔维会议要召开了&#xff0c;一大帮子物理学家又在深秋时节聚到了布鲁塞尔&#xff1b;玻尔来到会场时心中踹踹不安&#xff0c;看爱因斯坦似笑非笑的表情&#xff0c;吃不准…

这所院校23年分数线暴涨45分,临时扩招69人!!

本期为大家整理热门院校-“南京信息工程大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源…

关于【SD-WEBUI】的API:开发代码示例和帮助文档

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;启用API&#xff08;二&#xff09;编写调用程序&#xff08;2.1&#xff09;Python例子代码&#xff08;2.2&#xff09;执行&#xff08;2.3&#xff09;结果 &#xff08;三&#xff09;帮助文档&#xf…

第7章 动静分离

第7章 动静分离 Nginx的负载均衡和静态代理结合在一起&#xff0c;我们可以实现动静分离&#xff0c;这是实际应用中常见的一种场景。 动态资源&#xff0c;如jsp由tomcat或其他web服务器完成 静态资源&#xff0c;如图片、css、js等由nginx服务器完成 它们各司其职&#x…

苹果备忘录永久删除了怎么办?3种备忘录恢复的方法!

案例&#xff1a;iPhone备忘录彻底删除了怎么办&#xff1f; 【友友们&#xff0c;苹果备忘录永久删除了&#xff0c;还可以恢复吗&#xff1f;有什么方法&#xff1f;】 苹果备忘录是苹果系统自带的一款备忘录应用&#xff0c;可以帮助我们记录日程安排、备忘事项、重要信息等…

深度学习技巧应用13-神经网络中数据并行训练的原理

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分15-神经网络中数据并行训练的原理,在神经网络中,数据并行训练是一种常用的训练技术。它利用多个GPU或多个计算机对同一个模型进行训练,不同的设备处理相同的模型和数据,但会随机选择不同的批次数据,并使用反向传播…

视频创作教程-蜜蜂剪辑软件

视频创作教程-蜜蜂剪辑软件 作者介绍 一、视频剪辑软件二、蜜蜂剪辑软件使用1.视频比例选择2.添加视频素材3.视频分割4.添加文字5.转场滤镜6.其它 三、创作实例四、软件分享 作者介绍 熊文博&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&…

「隐语小课」LDP和CDP在联邦学习中对于隐私性以及鲁棒性的作用

本次分享内容为NDSS收录的一篇文章&#xff1a;《Local and Central Differential Privacy for Robustness and Privacy in Federated Learning》。这篇论文主要分析了LDP和CDP在联邦学习中对于隐私性以及鲁棒性的作用。围绕这篇论文的分享将分为以下4个部分&#xff1a; 动机与…

mac录屏软件推荐!相信我,看完你不会后悔

有粉丝后台问小编&#xff0c;自己的电脑是mac电脑&#xff0c;不知道如何使用mac电脑录屏&#xff0c;有没有mac录屏软件推荐&#xff1f;小编之前也是用的Windows电脑进行录屏&#xff0c;后来换了mac&#xff0c;经过多年的摸索&#xff0c;熟练掌握了录屏方法。今天小编就带…

在facebook上最容易开展的营销活动是什么?如何开展?

在Facebook上最容易开展的营销活动包括社交媒体广告、社群互动、社交内容分享以及活动与促销。这些活动可以帮助企业吸引目标受众、增加品牌曝光度、提高用户参与度和促进销售。下面让我们详细了解一下如何开展这些活动&#xff0c;并给出相应的案例。 1.社交媒体广告&#xff…

全景丨0基础学习VR全景制作,平台篇第20章:热点功能-文章

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 文章热点&#xff0c;即点击热点后会嵌入…

Java EE--多线程(二)

目录 四、多线程案例之--单例模式 3.1 单例模式 3.2 怎么去设计一个单例&#xff1f; 饿汉模式 懒汉模式 3.3 两种模式的总结 四、多线程案例之--单例模式 4.1 单例模式 是校招中最常考的设计模式之一. 啥是设计模式&#xff1f; 设计模式好比象棋中的 " 棋谱 &quo…

Cookie的使用

1.Cookie的工作原理 Web应用程序中使用的是HTTP.HTTP是无状态协议,客户端与服务器完成业务交互后,它们之间的联系会关闭.由于交互式Web应用的需求增加,管理会话和识别用户的身份应运而生.比如,用户A登录一个网站后,在第二次登录的时候会免登录,自动进入用户A的个人主页. 服务…

哪种蓝牙耳机戴着最舒服?佩戴最舒服的真无线蓝牙耳机

无论在地铁、咖啡厅、商场甚至是机场&#xff0c;佩戴蓝牙耳机可以让我们尽情地享受音乐&#xff0c;戴上耳机可以避免影响他人的同时也能避免隐私的泄露。因此这几年真无线蓝牙耳机也受到了广大网友的追捧。&#xff0c;下面分享几款佩戴舒适的蓝牙耳机给大家。 一、南卡小音…

修改文章的软件-有没有自动修改文章的软件

自动修改文章神器 自动修改文章神器是一种利用人工智能和自然语言处理技术&#xff0c;帮助用户快速修改和优化文章的工具。该软件能够检测文章的语法和拼写错误、表达不当的问题&#xff0c;并自动提供修改和优化建议。用户只需根据软件的提示进行修改&#xff0c;就能得到高…