tooltip实现悬停内容高亮及格式化

news2024/9/24 1:28:27

一: 通过highlight.js项目实现对json字符串的染色高亮

此项目是jsp文件,并且引用了element-ui/highlight.js的组件,对tooltip中的json文本(理论上支持highlight所支持的所有项目)进行高亮并格式化

二: 实现效果

在这里插入图片描述

三: 代码实现

关键点在于成功引入相关的js及css,并且在tooltip渲染时进行数据染色。再将染色后的数据放到v-html中进行页面渲染(关键方法: highlightedData)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ include file="/WEB-INF/pages/main/taglibs.jsp" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>主子服务查询</title>
    <script src="${pageContext.request.contextPath}/js/vueEle/2.7/vue.js"></script>
    <script src="${pageContext.request.contextPath}/js/vueEle/js/lib/vue-resource.js"></script>
    <script src="${pageContext.request.contextPath}/js/vueEle/2.7/vueEle.js"></script>
    <script src="${pageContext.request.contextPath}/js/highlight/es/highlight.min.js"></script>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/js/vueEle/2.7/vueEle.css">
    <link href="${pageContext.request.contextPath}/js/highlight/styles/atom-one-dark-reasonable.min.css"
          rel="stylesheet"
          type="text/css">
    <style>
        <%--  解决文本过长显示不开的问题   --%>
        .el-tooltip__popper {
            /*border-left: 20px solid #000000; !* 设置左侧边框为10px宽,颜色为黑色 *!*/
            /*border-right: 10px solid #000000; !* 设置左侧边框为10px宽,颜色为黑色 *!*/
            /*max-height: 700px;*/
            /*max-width: 800px;*/
            max-height: 95%;
            max-width: 65%;
            overflow-y: auto; /* 滑动框 */
            /*white-space: pre;*/
            /*word-wrap: break-word;*/
            text-align: left; /*文本靠左对齐*/
        }
    </style>
</head>
<body>
<div id="app" style="width: 100%">
    <template>
        <el-container>
            <el-header>
                <el-form ref="form" :model="searchForm" label-width="150px"
                         style="margin: 10px 10px 10px 10px;float: left"
                         :inline="true"
                         @keyup.enter.native="search">
                    <el-row>
                        <el-col>
                            <el-form-item label="工单号">
                                <el-input v-model="searchForm.applicationNo"></el-input>
                            </el-form-item>
                            <el-form-item label="商编号">
                                <el-input v-model="searchForm.merchantNo"></el-input>
                            </el-form-item>
                            <el-form-item>
                                <el-button type="primary" @click="search">查询</el-button>
                            </el-form-item>
                        </el-col>
                    </el-row>
                </el-form>
            </el-header>
            <el-main>
                <el-table
                        v-loading="loading"
                        :data="tableData"
                        style="width: 100%;margin-bottom: 20px;"
                        row-key="index"
                        border
                        empty-text="无数据"
                        property="sid" show-overflow-tooltip="true" label="" min-width="1"
                <%--                        default-expand-all--%>
                        :tree-props="{children: 'subFlowServiceRecords', hasChildren: 'hasChildren'}">

                    <el-table-column
                            prop="index"
                            label="序号"
                            width="100"></el-table-column>
                    <el-table-column
                            prop="applicationNo"
                            label="工单号">
                    </el-table-column>
                    <el-table-column
                            prop="merchantNo"
                            label="商编号"
                            width="150">
                    </el-table-column>
                    <el-table-column
                            prop="serviceName"
                            label="步骤">
                    </el-table-column>
                    <el-table-column
                            prop="status"
                            label="状态"
                            width="80">
                    </el-table-column>

                    <el-table-column label="请求信息"
                                     width="100"
                    >
                        <template slot-scope="scope" v-if="scope.row.mainServiceData">
                            <el-tooltip
                                    placement="left">
                                <div slot="content" v-html='highlightedData(scope.row.mainServiceData)'></div>
                                <el-button @click="copyData(scope.row.mainServiceData)">复制</el-button>
                            </el-tooltip>
                        </template>
                    </el-table-column>
                    <el-table-column
                            prop="startTime"
                            label="开始时间"
                            width="180">
                    </el-table-column>
                    <el-table-column
                            prop="endTime"
                            label="结束时间"
                            width="180">
                    </el-table-column>
                </el-table>
                <div class="block">
                    <el-pagination
                            @size-change="handleSizeChange"
                            @current-change="handleCurrentChange"
                            :page-size="pageData.pageSize"
                            :page-sizes="[10, 20, 30, 40]"
                            layout="total, sizes, prev, pager, next"
                            :total="pageData.total">
                    </el-pagination>
                </div>
            </el-main>
        </el-container>
    </template>


</div>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
                loading: false,
                tableData: [],
                pageData: {
                    currentPage: 1,
                    pageSize: 10,
                    total: 0,
                },
                searchForm: {
                    applicationNo: null,
                    merchantNo: null
                }
            }
        },
        methods: {
            copyData(data) {
                const textarea = document.createElement('textarea');
                textarea.value = JSON.stringify(JSON.parse(data), null, 2);
                document.body.appendChild(textarea);
                textarea.select();
                document.execCommand('copy');
                document.body.removeChild(textarea);
                this.$message({
                    message: '复制成功(已格式化)!',
                    type: 'success'
                });
            },
            highlightedData(code) {
                const language = 'json'; // 指定要高亮的语言,例如 JSON
                let code2 = JSON.stringify(JSON.parse(code), null, 2);
                code2 = hljs.highlight(language, code2).value;
                return '<pre><code>' + code2 + '</pre></code>';
            },
            handleSizeChange(val) {
                this.pageData.pageSize = val;
                this.search()
            },
            handleCurrentChange(val) {
                this.pageData.currentPage = val;
                this.search()
            },
            search() {
                let applicationNo = this.searchForm.applicationNo;
                let merchantNo = this.searchForm.merchantNo;
                if ((applicationNo && applicationNo !== '')
                    || (merchantNo && merchantNo !== '')) {
                    this.loading = true;
                    this.$http.post('../flowService/queryRecordByApplicationNo',
                        {
                            applicationNo: applicationNo,
                            merchantNo: merchantNo,
                            currentPage: this.pageData.currentPage,
                            pageSize: this.pageData.pageSize
                        }
                    ).then(res => {
                        if (res.body.status === 'success') {
                            this.tableData = res.body.object.flowServiceRecords
                            this.pageData.total = res.body.object.total;
                            this.setSerialNumbers(this.tableData);
                        } else {
                            alert(res.body.errorMessage);
                        }
                        this.loading = false;
                    })
                } else {
                    this.loading = false;
                    this.$message({
                        message: '请至少输入一个参数!',
                        type: 'warning'
                    });
                }
            },
            setSerialNumbers(data, parentSerial = '') {
                let serial = 1;
                for (const item of data) {
                    item.index = parentSerial + serial;
                    serial++;
                    if (item.subFlowServiceRecords && item.subFlowServiceRecords.length > 0) {
                        this.setSerialNumbers(item.subFlowServiceRecords, item.index + '.');
                    }
                }
            }
        }
    })
</script>
</body>
</html>

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

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

相关文章

树莓派 qt 调用multimedia、multimediawidgets、serialport、Qchats

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、测试11.命令安装出现错误 二、测试21. 安装 Qt Charts&#xff1a;2. 安装 Qt Multimedia 和 Qt MultimediaWidgets&#xff1a;3. 安装 Qt SerialPort&…

postgis ST_CoverageInvalidEdges用法

官方文档 概要 geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance 0); 描述 一个窗口函数&#xff0c;用于检查窗口分区中的多边形是否形成有效的多边形覆盖范围。 它返回线性指示器&#xff0c;显示每个多边形中无效边&#xff08;如果有&#x…

C++项目——云备份-⑥-服务端热点管理模块的设计与实现

文章目录 专栏导读1.热点管理类设计2.热点管理类的实现与整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;CSDN内容合伙人…致力于 C/C、Linu…

解放工程师双手帮助网工做运维

✍ SNMP为什么被誉为“网管神器”&#xff1f; ✍ SNMP不同版本有何区别&#xff1f; ✍ SNMP有哪些问题及Telemetry有何优势&#xff1f; telnet, ssh远程登录到设备&#xff1a; 简单网络管理协议&#xff1a;SNMP 集中式管理&#xff1a; 华为&#xff1a;e-sight 华三…

计算机毕设 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天向大家介绍 一个深度学习项目 基于CNN实现谣言检测 1.1 背景 社交媒体的发展在加速信息传播的…

使用NATAPP内网穿透详细步骤

在开发过程中&#xff0c;避免不了前端和后端不在一个局域网下&#xff0c;这时候&#xff0c;前后端联调的时候&#xff0c;前端访问不到后端的服务器&#xff0c;使用穿透就可以解决这个问题。 1、打开网址https://natapp.cn/2、进行注册&#xff0c;然后登录 3、击购买渠道…

大数据-Storm流式框架(五)---DRPC

DRPC 概念 分布式RPC&#xff08;DRPC&#xff09;背后的想法是使用Storm在运行中并行计算真正强大的函数。 Storm拓扑接收函数参数流作为输入&#xff0c;并为每个函数调用发送结果的输出流。 DRPC并不是Storm的一个特征&#xff0c;因为它基于Storm的spouts&#xff0c;bo…

推荐一个高效测试用例工具:XMind2TestCase..

一、背景 软件测试的核心是什么&#xff1f;毫无疑问是测试分析和测试用例设计&#xff0c;也是日常测试投入最多时间的工作内容之一。 然而&#xff0c;传统的测试用例设计过程有很多痛点&#xff1a; 1、使用Excel表格进行测试用例设计&#xff0c;虽然成本低&#xff0c;但…

FL Studio音乐编曲软件好不好用?要不要购买

音乐编曲软件的出现使得音乐创作者能够克服时间和空间的限制&#xff0c;随时随地进行创作。随着信息时代的发展&#xff0c;使用编曲软件已成为音乐创作领域的主流。那么编曲软件哪个好用呢&#xff1f;我推荐这三款。 在业内&#xff0c;常用的音乐编曲软件包括Cubase、Logi…

增强常见问题解答搜索引擎:在 Elasticsearch 中利用 KNN 的力量

在快速准确的信息检索至关重要的时代&#xff0c;开发强大的搜索引擎至关重要。 随着大型语言模型和信息检索架构&#xff08;如 RAG&#xff09;的出现&#xff0c;在现代软件系统中利用文本表示&#xff08;向量/嵌入&#xff09;和向量数据库已变得越来越流行。 在本文中&am…

scratch接钻石 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch接钻石 一、题目要求 1、准备工作 2、功能实现 二、案例分析

postgis ST_ClipByBox2D用法

官方文档 概述 geometry ST_ClipByBox2D(geometry geom, box2d box); 描述 以快速且宽松但可能无效的方式通过 2D 框剪切几何体。 拓扑上无效的输入几何图形不会导致抛出异常。 不保证输出几何图形有效&#xff08;特别是&#xff0c;可能会引入多边形的自相交&#xff09;…

FL Studio21.2中文版多少钱?值得下载吗

水果&#xff0c;全称Fruity Loop Studio&#xff0c;简称FL Studio。是一款全能的音乐制作软件&#xff0c;经过二十多年的演化更迭&#xff0c;其各项功能非常的先进。其开创性的Pat\song模式&#xff0c;也为初学者的学习提供了便利。那么水果音乐制作软件需要多少钱呢&…

鸡尾酒学习——沧海桑田

1、材料&#xff1a;冰块&#xff08;或者雪莲&#xff09;、蓝橙力娇酒、伏特加、橙汁、柠檬、雪碧/气泡水&#xff1b; 2、口感&#xff1a;酸甜口味&#xff0c;下层感觉是再喝橙汁&#xff0c;上层在喝有些度数的雪碧&#xff0c;可能是昨天的长岛冰茶过于惊艳&#xff0c;…

机器学习(四十九):高斯混合模型

补充一个聚类算法:高斯混合模型 假设有一组需要根据它们的相似性分组到几个部分或簇中的数据点。在机器学习中,这被称为聚类。有几种可用的聚类方法: K均值聚类分层聚类高斯混合模型在这篇文章中,我们将讨论高斯混合模型。 文章目录 正态或高斯分布期望最大化(EM)算法期…

微信 macOS 版迎来 3.8.4.20 更新,新功能一览

微信 macOS 版迎来 3.8.4.20 更新&#xff0c;增加了多个新功能&#xff0c;包括可将某个聊天在独立窗口中显示、可在聊天中搜索表情等。 附更新信息如下&#xff1a; 可将某个聊天在独立窗口中显示&#xff1b; ・可在聊天中搜索表情&#xff1b; ・新增 「看一看」&#…

Umijs创建一个antd+Ts项目环境

上文搭建Umijs环境并创建一个项目 介绍基本操作中 我们构建了一个Umijs环境的环境 但也只创建了一个页面 真正开发来讲 也不可能只创建几个界面这么简单 这里面的创建 还是非常完整的 这里 我创建一个文件夹 主要是做我们的项目目录 然后 我们在终端输入命令 然后 打开目录终…

VScode 自定义主题各参数解析

参考链接&#xff1a; vscode自定义颜色时各个参数的作用(史上最全)vscode编辑器&#xff0c;自己喜欢的颜色 由于 VScode 搜索高亮是在是太不起眼了&#xff0c;根本看不到此时选中到哪个搜索匹配了&#xff0c;所以对此进行了配置&#xff0c;具体想增加更多可配置项可参考…

第三篇:实践篇 《使用Assembler 实现图片任意切割功能》

实现原理&#xff1a; 共用一个texture、material、渲染状态等。紧通过修改vertex、uvs、indexes数据即可实现任意切割功能。 一、线段分割多边形&#xff0c;并分散多边形 线段分割多边形 已知多边形points&#xff0c;线段sp、ep。线段分割多边形得到两个多边形。 publi…

双十一期间VBA钜惠

大家好&#xff0c;本年度双11即将到来&#xff0c;为了答谢大家多年来的支持及更广泛的推广VBA的应用&#xff0c;“VBA语言専功”在此期间推出巨大优惠&#xff1a;此期间打包购买VBA技术资料实行半价优惠。 1 &#xff1a;面向对象&#xff1a;学员及非学员 2 &#xff1a…