Vue 高亮文本

这篇博客介绍了如何在Vue中使用自定义指令实现文本高亮功能,通过创建全局指令`v-light`,结合传入的上下文、高亮文本和自定义样式类,达到文本高亮的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue 高亮文本

我为了方便和简单处理, 想着使用 Vue自带的自定义指令进行文本高亮

Vue custom-directive

发布到了npm
vue-light-word

效果如图
在这里插入图片描述

加入全局指令

import Vue from 'vue'
import VueHighLight from 'vue-light-word'

Vue.config.productionTip = false
// 在new之前注册v-light
// VueHighLight(Vue, {defaultClass: 'default-light'})
VueHighLight(Vue)
new Vue({
  render: h => h(App),
  store
}).$mount('#app')

使用

注意: 需要自己写一个全局的高亮class .default-light, 处理默认样式问题

 .default-light {
    color: red;
  }
<template>
  <div id="d1">
    <span v-light="[context, light]"></span>
    <input type="text" v-model="context">
  </div>
</template>
<script>


export default {
  name: 'App',
  data () {
    return {
      context: '你好, hello world<script><\/script> ',
      light: 'world'
    }
  },
}
</script>

<style>
  .default-light {
    color: red;
  }
</style>

其中 v-light="[context, light, customClass]"

  1. context 是整个文本
  2. light 是想要高亮的文本
  3. 自定义的样式, 如果不传则使用默认的class
### Vue.js 中实现 PDF 文件内关键词高亮功能的方案 在 Vue.js 项目中实现 PDF 文件内的关键词高亮功能,可以借助 `PDF.js` 这一强大的库来完成。以下是具体的实现思路和技术细节: #### 1. **技术选型** - 使用 `PDF.js` 是目前主流的选择之一,它是一个由 Mozilla 开发的强大工具,能够解析和渲染 PDF 文档[^1]。 - 结合 Vue.js 的组件化特性,可以通过封装一个专门用于展示和操作 PDF 的组件来实现需求。 #### 2. **核心逻辑** - 高亮功能的核心在于定位到文档中的特定文本并将其标记出来。这通常通过遍历页面上的文本层(text layer),匹配目标关键词,并动态插入 HTML 元素来实现[^3]。 - 下面是一些关键步骤: - 加载 PDF 文件并通过 `PDF.js` 渲染每一页的内容。 - 提取当前页的文字内容并与输入框中的关键词进行比较。 - 如果发现匹配项,则在其周围包裹 `<mark>` 标签或其他样式标签以达到视觉上突出的效果。 #### 3. **代码示例** 以下是一个简单的实现例子,展示了如何利用 `PDF.js` 和 Vue 组件配合工作: ```javascript <template> <div id="app"> <input v-model="searchTerm" placeholder="Search..." /> <canvas ref="pdfCanvas"></canvas> </div> </template> <script> import * as pdfjsLib from 'pdfjs-dist'; pdfjsLib.GlobalWorkerOptions.workerSrc = '/path/to/pdf.worker.min.js'; // 设置 worker 路径 export default { data() { return { searchTerm: '', pdfDoc: null, currentPageNum: 1, }; }, methods: { async loadPdf(url) { this.pdfDoc = await pdfjsLib.getDocument(url).promise; this.renderPage(this.currentPageNum); }, renderPage(num) { const page = this.pdfDoc.getPage(num); page.then((page) => { const viewport = page.getViewport({ scale: 1 }); const canvas = this.$refs.pdfCanvas; const context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext).then(() => { if (this.searchTerm.length > 0) { this.highlightText(page, this.searchTerm); // 执行高亮函数 } }); }); }, highlightText(page, term) { page.getTextContent().then((textContent) => { textContent.items.forEach((item) => { if (item.str.includes(term)) { console.log(`Found "${term}" at position`, item.transform); // 此处可以根据 transform 数据绘制矩形或者应用其他形式的标注 } }); }); }, }, mounted() { this.loadPdf('/example.pdf'); // 替换为实际的 PDF URL 或 Blob 地址 }, }; </script> ``` 上述代码片段实现了基本的加载、渲染以及初步查找机制。对于更复杂的交互体验比如跨多页搜索结果导航等功能则需进一步扩展开发[^4]。 #### 4. **常见问题及解决方案** - **错误消息:“file origin does not match viewer’s”**: 当尝试嵌入外部资源时可能会遇到此安全限制。解决办法通常是调整服务器配置允许 CORS 请求头访问,或将所有静态资产部署在同一域名下运行服务端代理转发请求。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值