主頁 > 企業開發 > 記錄--前端實作點擊選詞功能

記錄--前端實作點擊選詞功能

2023-05-10 08:52:49 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

今天有一個需求,點擊選中某個英文單詞,然后對這個單詞做一些處理,例如高亮背景、查看一些詳細資訊等等,今天簡單實作了一下,效果如下:(支持移動端,chrome和sarafi瀏覽器均能正常使用,語言?? vue3 + typescript)

highlight.gif

選詞

由于要動態添加給某些單詞動態添加一些標簽,我們這里可以考慮使用v-html

首先我們先撰寫一下簡單的結構

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

<template>
  <div  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  @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

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/552039.html

標籤:其他

上一篇:學node 之前你要知道這些

下一篇:返回列表

標籤雲
其他(158739) Python(38124) JavaScript(25412) Java(18024) C(15222) 區塊鏈(8263) C#(7972) AI(7469) 爪哇(7425) MySQL(7172) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5336) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4570) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1934) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1875) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--前端實作點擊選詞功能

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 今天有一個需求,點擊選中某個英文單詞,然后對這個單詞做一些處理,例如高亮背景、查看一些詳細資訊等等,今天簡單實作了一下,效果如下:(支持移動端,chrome和sarafi瀏覽器均能正常使用。語言🚀 vue3 + typescript) ......

    uj5u.com 2023-05-10 08:52:49 more
  • 學node 之前你要知道這些

    初識nodejs 19年年底一個偶然的機會接到年會任務,有微信掃碼登錄、投票、彈幕等功能,于是決定用node 來寫幾個服務,結果也比較順利。 當時用看了下koa2的官方檔案,知道怎么連接資料庫、怎么映射表物體,怎么處理http,怎么處理例外等,就可以直接寫起來了。從應用層面上來說 nodejs 入門 ......

    uj5u.com 2023-05-10 08:47:38 more
  • HTML常用標簽

    1. 基礎語法 1.1 標記(標簽) - 常規標記(雙標記) <標記></標記> - 空標記(單標記) <標記 /> 1.2 <!DOCTYPE html> 檔案型別 1.3 <html lang="zh-CN"> 為瀏覽器指出本檔案所用語言 1.4 <meta /> - <meta charset ......

    uj5u.com 2023-05-10 08:47:30 more
  • js中的變數

    在JavaScript中,我們用var關鍵字來宣告一個變數,var關鍵字后緊跟變數的名稱,例如: var a1 = 40; a1就是變數的名稱,用來標識一個變數,所以它又稱為變數的識別符號。一個變數的識別符號必須是由字母、數字、下劃線組成,但首字符不能為數字,如: 1user、#user 都不是正確的標 ......

    uj5u.com 2023-05-10 08:47:25 more
  • 一行代碼搞定 font-size 回應式

    前言 公司要做大屏,但是大屏還要有個嵌在系統的版本,螢屏(iframe)小了但字體大了怎么辦。網上找了很多代碼都很長,個人參考了資料后實作了一個一行代碼 font-size 回應式。 TL;DR html { font-size: clamp(12px, calc(7px + 0.390625vw) ......

    uj5u.com 2023-05-10 08:47:20 more
  • 什么是jsonp

    jsonp 是前端一種用來解決網站跨域的技術,利用script標簽不受同源策略影響的特性引入一個非同源的js檔案,并定義一個回呼函式來接收資料,這樣就可以實作跨域獲取資料了,例如: 現在有一個鏈接回傳的資料是這樣的: cb({ "name": "swk", "age": 18 }) 這是一個標準的j ......

    uj5u.com 2023-05-10 08:47:16 more
  • JS中記憶體泄漏的幾種情況

    JavaScript 中的記憶體泄漏是指程式中使用的記憶體不再被需要卻沒有被釋放,最終導致瀏覽器或者 Node.js 行程使用的記憶體越來越大,直到程式崩潰或者系統運行緩慢。 在 JavaScript 中,記憶體泄漏通常是由于變數、物件、閉包、事件監聽器等長期存在而沒有被釋放引起的。這些長期存在的參考會阻止 ......

    uj5u.com 2023-05-10 08:47:12 more
  • 如何在VSCode Webview中打開一個新的頁面

    上一篇我介紹了如何在VSCode Webview中實作點擊鏈接下載圖片或檔案,本文介紹如何在默認瀏覽器中打開一個新的頁面。 在瀏覽器中,如果要實作打開一個新的頁面有許多種不同的方法,例如: window.open("https://www.cnblogs.com/jaxu", "_blank"); ......

    uj5u.com 2023-05-10 08:40:49 more
  • 學node 之前你要知道這些

    初識nodejs 19年年底一個偶然的機會接到年會任務,有微信掃碼登錄、投票、彈幕等功能,于是決定用node 來寫幾個服務,結果也比較順利。 當時用看了下koa2的官方檔案,知道怎么連接資料庫、怎么映射表物體,怎么處理http,怎么處理例外等,就可以直接寫起來了。從應用層面上來說 nodejs 入門 ......

    uj5u.com 2023-05-10 08:30:31 more
  • js中的變數

    在JavaScript中,我們用var關鍵字來宣告一個變數,var關鍵字后緊跟變數的名稱,例如: var a1 = 40; a1就是變數的名稱,用來標識一個變數,所以它又稱為變數的識別符號。一個變數的識別符號必須是由字母、數字、下劃線組成,但首字符不能為數字,如: 1user、#user 都不是正確的標 ......

    uj5u.com 2023-05-10 08:30:25 more