当前位置: 首页 > news >正文

通过pre标签进行json格式化展示,并实现搜索高亮和通过鼠标进行逐个定位的功能

功能说明

  1. 实现一个对json进行格式化的功能
  2. 添加搜索框,回车进行关键词搜索,并对关键词高亮显示
  3. 搜索到的多个关键词,回车逐一匹配
  4. 监听json框,如果发生了编辑,需要在退出时提示,在得到用户确认的情况下再退出

效果展示

在这里插入图片描述

说明:如上图中,输入“编程”两个字,每回车一下,就定位到匹配到的第二个位置,并将当前匹配到的文字滚动到顶部。

实现步骤

第一步:编写HTML

分别添加一个输入框、一个用于展示json的pre标签、和一个取消按钮

说明:此处的其它功能有省略

<template><div><el-input class="input" v-model="searchValue" @keyup.enter.native="handleEnter" placeholder="输入关键词回车搜索"></el-input><pre class="content" id="json-pre" contenteditable="true" v-html="preJsonHtml"></pre><el-button @click="handleCancle">取消</el-button></div>
</template>

第二步:实现JavaScript方法

2.1 定义必要的变量和进行变量监听

<script lang="ts" setup>
import { computed, nextTick, onMounted, ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ElMessageBox } from 'element-plus';const route = useRoute()
const router = useRouter()// 存放获取到的json文件的内容
let jsonData = ref()// 搜索框内容
let searchValue = ref()// 用于在pre标签里展示的HTML
let preJsonHtml = ref()// 表示json是否被修改
let isPreEdit = ref(false)// 当前搜索匹配到第几个
let matchNum = ref(0)// 拼接一个获取json文件的地址
const jsonUrl = computed(() => {// 这是亚马逊上面部署的一个pdfjs服务,及存放json文件的文件夹拼接地址const aws_server = 'http://xxx.s3-website-xxx.amazonaws.com/pdfjs-4.0.379-dist/web/docs/'// 从路由中获取到文件名称const json_name = route.query.json as string// 拼接得到最终的文件地址return `${aws_server}${json_name}`
})// 监听jsonData,修改后需要动态更新文本框里显示的内容
watch(() => jsonData.value, val => {preJsonHtml.value = JSON.parse(JSON.stringify(val, null, 4))
})// 监听搜索框的内容,主要目的是:当搜索框中的内容变化了,需要将matchNum重置为0,开始新输入内容的第一个搜索
watch(() => searchValue.value, val => {matchNum.value = 0
})onMounted(() => {// 这里注意,需要使用nexttick,在页面渲染出来以后再做计算nextTick(() => {// json-prevar preTag = document.getElementById('json-pre');var originalContent = preTag?.textContent;// 添加监听事件preTag?.addEventListener('input', function() {if (preTag?.textContent !== originalContent) {console.log('内容已被修改');isPreEdit.value = true // 标记json被修改了}});})// 获取json文件,并赋值给jsonDatafetch(jsonUrl.value).then(res => res.json()).then(r => {jsonData.value = JSON.stringify(r, null, 4)})
})
</script>

2.2 输入框回车事件

// 输入框回车事件
// 之所以使用这个方法,是因为input输入框在输入一个文字后,需要多次联系重复搜索
const handleEnter = (event) => {// 判断下jsonData的类型,需要一个字符串格式let result = typeof jsonData.value !== 'string' && JSON.stringify(jsonData.value) || jsonData.value// 正则表达式,对输入框中的内容全匹配const Reg = new RegExp(searchValue.value, 'g')// 获取这种全匹配下,有多少个匹配结果// 这一步非常重要,因为需要多次进行搜索和修改样式,所以必须要记录匹配结果let matchs = result.match(Reg)// 判断:// 匹配到结果 且 当前搜索到匹配结果的最后一位时,重新开始搜索第一个if((matchs && matchs.length) && matchNum.value + 1 >= matchs.length) {matchNum.value = 0}// 否则,继续向下matchNum.value += 1// 如果匹配有结果if(result) {// 定义一个替换方案// 将匹配结果替换为一个span标签,id为highLight,颜色为黄色let replacement = `<span id="highlight" style="background: yellow;">${searchValue.value}</span>`// 调用字符串匹配方法:在后文中有写const res = replaceNumMatch(Reg, result, replacement, matchNum.value);// preJsonHtml赋值,将它包裹在了一个div中preJsonHtml.value = `<div>${JSON.parse(JSON.stringify(res, null, 4))}</div>`/*** 这里是实现dom结构的滚动*/const div = document.getElementById('json-pre');const span = document.getElementById('highlight');if (div && span) {// 计算滚动位置const scrollTo = span.offsetTop - div.offsetTop - 10; // 这里多了一个10px的间距// 滚动到指定位置// 当搜索第一个时,滚动到顶部if(matchNum.value === 1) {div.scrollTop = 0return}// 其它滚动到指定为止div.scrollTop = scrollTo;}}
}

2.3 正则表达式进行字符串匹配和替换方法

/*** 使用正则表达式进行字符串替换的方法*/
function replaceNumMatch(regexp, str, replacement, i) {let count = 0;return str.replace(regexp, function(matched) {count++;if (count === i) {return replacement; // 替换第i个匹配字符为指定的字符串} else {return matched; // 保持其他匹配字符不变}});
}

2.4 json对话框编辑取消方法

/*** 取消方法:* 这里的要求是,当json被修改后退出需要提醒* 所以这里增加了一个isPreEdit的变量,标记json是否被修改*/
const handleCancle = () => {if(isPreEdit.value) {// 如果被修改增加提醒ElMessageBox.confirm('内容有修改,是否进行保存?', '提示',{confirmButtonText: '是',cancelButtonText: '否',type: 'warning',closeOnClickModal: false,showClose: false}).then(() => {// do something // 如可以保存数据等}).catch(() => {// 否则 跳转到指定路由router.push({ path: '/xxx' })})return}// 如果没有被修改,则跳转到指定路由router.push({ path: '/xxx' })
}

第三步:样式

pre在文字过长时,不换行。此处的目的是为了让长段的pre换行

<style lang="scss" scoped>// 让pre里的文字自动换行
pre {white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;
}
</style>

相关文章:

通过pre标签进行json格式化展示,并实现搜索高亮和通过鼠标进行逐个定位的功能

功能说明 实现一个对json进行格式化的功能添加搜索框&#xff0c;回车进行关键词搜索&#xff0c;并对关键词高亮显示搜索到的多个关键词&#xff0c;回车逐一匹配监听json框&#xff0c;如果发生了编辑&#xff0c;需要在退出时提示&#xff0c;在得到用户确认的情况下再退出…...

5分钟了解清楚【osgb】格式的倾斜摄影数据metadata.xml有几种规范

数据格式同样都是osgb&#xff0c;不同软件生产的&#xff0c;建模是参数不一样&#xff0c;还是有很大区别的。尤其在应用阶段。 本文从建模软件、数据组织结构、metadata.xml&#xff08;投影信息&#xff09;、应用几个方面进行了经验性总结。不论您是初步开始建模&#xf…...

CCIE-10-IPv6-TS

目录 实验条件网络拓朴 环境配置开始Troubleshooting问题1. R25和R22邻居关系没有建立问题2. 去往R25网络的下一跳地址不存在、不可用问题3. 去往目标网络的下一跳地址不存在、不可用 实验条件 网络拓朴 环境配置 在我的资源里可以下载&#xff08;就在这篇文章的开头也可以下…...

《QT实用小工具·十七》密钥生成工具

1、概述 源码放在文章末尾 该项目主要用于生成密钥&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…...

CSP 比赛经验分享

中国软件专业技术资格&#xff08;水平&#xff09;考试&#xff08; CSP-S &#xff09;是一项旨在评价软件和信息技术 专业人员专业技术水平的考试。对于参加过 CSP 比赛的人来说&#xff0c;这是一个展示 自己编程能力、逻辑思维和解决问题能力的好机会。下面是一些基于…...

探究“大模型+机器人”的现状和未来

基础模型(Foundation Models)是近年来人工智能领域的重要突破&#xff0c;在自然语言处理和计算机视觉等领域取得了显著成果。将基础模型引入机器人学&#xff0c;有望从感知、决策和控制等方面提升机器人系统的性能&#xff0c;推动机器人学的发展。由斯坦福大学、普林斯顿大学…...

Commitizen:规范化你的 Git 提交信息

简介 在团队协作开发过程中&#xff0c;规范化的 Git 提交信息可以提高代码维护的效率&#xff0c;便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具&#xff0c;它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…...

官网下载IDE插件并导入IDE

官网下载IDEA插件并导入IDEA 1. 下载插件2. 导入插件 1. 下载插件 地址&#xff1a;https://plugins.jetbrains.com/plugin/21068-codearts-snap/versions 说明&#xff1a;本次演示以IDEA软件为例 操作&#xff1a; 等待下载完成 2. 导入插件 点击File->setting->Pl…...

三行命令解决Ubuntu Linux联网问题

本博客中Ubuntu版本为23.10.1最新版本&#xff0c;后续发现了很多问题我无法解决&#xff0c;已经下载了另外一个版本22.04&#xff0c;此版本自带网络 一开始我找到官方文档描述可以通过命令行连接到 WiFi 网络&#xff1a;https://cn.linux-console.net/?p10334#google_vig…...

AI大模型在自然语言处理中的应用:性能表现和未来趋势

引言 A. AI大模型在自然语言处理中的应用背景简介 近年来&#xff0c;随着深度学习和人工智能技术的快速发展&#xff0c;越来越多的研究人员和企业开始关注应用于自然语言处理的AI大模型。这些模型采用了深层的神经网络结构&#xff0c;具有强大的学习和处理能力&#xff0c…...

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…...

【备战蓝桥杯】2024蓝桥杯赛前突击省一:基础数论篇

2024蓝桥杯赛前突击省一&#xff1a;基础算法模版篇 基础数论算法回顾 判断质数&#xff08;试除法&#xff09; 时间复杂度O&#xff08;sqrt(n)&#xff09; static int is_prime(int n){if(n<2) return 0;for (int i2;i<n/i;i){if(n%i0) return 0;}return 1; }质因…...

golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新

1.因为业务需要查询父文档以及其下子文档&#xff0c;搞了很久才理清楚。 首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面 {"query": {"nested": {"path": "comments","query": {"match…...

精准备份:如何自动化单个MySQL数据库的备份过程

自动化备份对于维护数据库的完整性和安全性至关重要。本指南将向您展示如何使用Shell脚本来自动化MySQL数据库的备份过程。 备份脚本内容 首先&#xff0c;这是我们将使用的备份脚本&#xff1a; #!/bin/bash# 完成数据库的定时备份 # 备份路径 BACKUP/data/backup/db # 当前…...

Green Hills 自带的MULTI调试器查看R7芯片寄存器

Green Hills在查看芯片寄存器时需要导入 .grd文件。下面以R7为例&#xff0c;演示一下过程。 首先打开MULTI调试器&#xff0c;如下所示View->Registers&#xff1a; 进入如下界面&#xff0c;选择导入寄存器定义文件.grd&#xff1a; 以当前R7芯片举例&#xff08;dr7f7013…...

Jupyter Notbook如何安装配置并结合内网穿透实现无公网IP远程连接使用

文章目录 推荐1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…...

LightM-UNet:Mamba 辅助的轻量级 UNet 用于医学图像分割

文章目录 摘要1 简介2、方法论2.1、架构概述2.2、编码器块2.3、瓶颈块2.4、解码器块 3、实验4、结论 摘要 https://arxiv.org/pdf/2403.05246.pdf UNet及其变体在医学图像分割中得到了广泛应用。然而&#xff0c;这些模型&#xff0c;特别是基于Transformer架构的模型&#xf…...

探索 Java 网络爬虫:Jsoup、HtmlUnit 与 WebMagic 的比较分析

1、引言 在当今信息爆炸的时代&#xff0c;网络数据的获取和处理变得至关重要。对于 Java 开发者而言&#xff0c;掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具&#xff1a;Jsoup、HtmlUnit 和 WebMagic&#xff0c;分析…...

day16 java object中equals、finalize、

Object类 1.Object类是所有类的父类。 2.一个类如果没有显示继承其它类默认继承Object类equals方法 1.Object中的equals方法 - 用来比较地址值 public boolean equals(Object obj) { return (this obj); } 2.像核心类库中的许多类都重写了equals方法&#xff08;比如&…...

如何应用电桥电路的原理?

电桥电路是一种常用的测量技术&#xff0c;它利用了四个电阻的网络来检测电路的平衡状态。在平衡状态下&#xff0c;电桥的输出电压为零&#xff0c;这种特性使得电桥电路非常适合于精确测量电阻、电感、电容等电气参数&#xff0c;以及用于传感器和测量设备中。以下是电桥电路…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...