vue添加水印踩坑

2023-11-16

介绍

前景: app页面添加水印展示
技术实现:watermark-dom
完整代码:vue-watermark
实现效果:
7ik2j-ysu0j.gif
功能描述:

  • 添加、删除、更新水印

引入

方式一:(推荐,方便拓展)

在index.html引入相关文件:

<script type="text/javascript" src="./watermark.js"></script>

方式二:

npm包引入
通过npm install watermark-dom获取水印组件包
在vue文件中引入相关文件:

import watermark from 'watermark-dom'
// 或者
var watermarkDom = require("watermark-dom")

使用

  1. 初始化水印
watermark.init({ watermark_txt: "测试水印,1021002301,测试水印,100101010111101" })
  1. 手动加载水印
watermark.load({ watermark_txt: "测试水印,1021002301,测试水印,100101010111101" })
  1. 删除水印
watermark.remove()

踩坑之旅

难点一:使用npm包引入的方式来实现水印,发现显示不全

  • 对于带有中文符号的字符串显示是正常的,如
    测试水印,1021002301,测试水印,100101010111101

image.png

  • 而对于全是英文单词或符号的字符串就会导致显示不全,如
    EB1DBDvlQHkV1653898831963@EB1_CSYSU9xMut_bNaHOOH7b_bCOvzFW6N_c4KDS061VmwH

image.png

思路:
给生成的水印DOM添加样式,强制英文单词断行

word-break: break-all;

尝试:

1.观察生成的水印DOM

1653983672(1).png

于是尝试覆盖shadow-root元素中的样式,直接在shadow DOM中注入样式

const style = document.createElement('style')
style.innerHTML = 'div { word-break: break-all; }'
const host = document.getElementById('wm_div_id')
host.shadowRoot.appendChild(style)
host.innerHTML = host.shadowRoot

PS:若不起作用,可以尝试将上面的代码放在一个setTimeout()函数中异步执行
注意:仅当Shadow DOM模式设置为“open”时它才会起作用.

2.查看效果:

image.png

看着像是解决了bug,然而在实际场景中,切换不同的页面会导致还是显示不全,具体原因咱也不知道,估计是这个插件的问题吧。

u=1183543500,2455753574&fm=253&fmt=auto&app=120&f=GIF.gif

解决:

1.本地引入封装的js文件
public/index.html:

<script type="text/javascript" src="./watermark.js"></script>

2.解决报错

image.png

找到报错行所在代码,排查发现MutationObserver重复定义了,于是注释掉该行代码即可

const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;

3.watermark.js文件中loadMark()函数添加一行代码:

mask_div.style['word-break'] = "break-all";

如图:

1653986200(1).png

难点二:清空不存在的水印报错

image.png

思路:使用try-catch语句捕获异常或直接设置水印为空字符串
方法一:

try {
    watermark.remove()
} catch (error) {}

方法二:

watermark.load({ watermark_txt: ` ` })

总结

原本是一个简单添加水印功能,奈何一开始方向没选对,耗费了大量时间解决bug,记录下本次踩坑之旅。

641.webp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue添加水印踩坑 的相关文章

随机推荐

  • Linux下利用TCP的服务端和客户端实现简单收发消息

    服务端采用了线程 可以同时提供给多台客户端连接 TCP的服务端 tcp server c include
  • 每秒上万并发下的Spring Cloud性能优化之道

    本文为转载文章 作者 中华石杉 十余年BAT架构经验 倾囊相授 作者微信公众号 石杉的架构笔记 ID shishan100 一 写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构 毕竟现在这是非常火的一门技术
  • MySQL中的any_value()函数

    转载 MySQL中的any value 函数 小李小李彬彬有礼的博客 CSDN博客
  • 深入探索透视投影变换(续)

    潘宏 2009 4 14 本人水平有限 疏忽错误在所难免 还请各位数学高手 编程高手不吝赐教 email popyy netease com B站专栏 https b23 tv oWsl6PD 在上一篇文章中我们讨论了透视投影变换的原理 分
  • 涂鸦NBIOT OpenCPU开发快速入门(三)

    1 开发板选择 工欲善其事 必先利其器 我之前做了两款开发板 其实主要是为了我工作上开发的方便 第一款用来测试通用对接 的方式比较友好 第二个板子主要特色在于开发调试起来非常方便 涂鸦 模组多个平台的芯片都是默认三个串口的 烧录口 通讯口
  • 《算法导论》选择问题(找第K大的数)

    选择问题 Selection Problem 即在n个元素的集合中寻找第K小的元素的问题 第K小的元素又叫第K个顺序统计量 有以下几种变体 找最大值和最小值 同时找最大和最小值 找中位数 第n 2小 找任意第K小的元素 找Top K的元素
  • 当SpringCloud微服务发生线程隔离(舱壁模式)和熔断降级时(微服务失败的回调),利用FeignClient整合Sentinel,返回用户一个友好提示或者默认结果

    目录 一 线程隔离 1 1线程隔离的两种实现方式 二 熔断降级 2 1慢调用 2 2异常比例 2 3异常数 三 FeignClient整合Sentinel 3 1修改配置 开启sentinel功能 3 2编写失败降级逻辑 3 2 1利用Fa
  • 贪心(acwing)

    每次选择当前的最优解 没什么固定的套路 先试一些做法 举例子验证 尝试证明一下 严格地推 区间问题 例1 1 将每个区间按照右端点从小到大排序 2 从前往后依次枚举每个区间 如果当前区间已经包含点 则直接pass 否则选择当前区间的右端点
  • Cenos6.5 安装Gcc编译器

    本人使用的是CentOS 6 5 64位系统 由于在安装系统的时候并没有勾选安装gcc编译器 因此需要自行安装gcc编译器 使用yum安装gcc 对于配备了yum的Linux发行版而言 安装gcc编译器就变得so easy 我们只需要分别执
  • 三维数据处理软件架构

    三维数据处理软件都包含哪些模块 三维数据处理软件 一般包含三个模块 数据管理和处理 三维渲染 UI 这与图形学的三个经典问题是相对应的 建模 渲染和交互 与一般常见的数据处理软件 比如图像视频处理 不同的是 这里的数据展示模块需要三维渲染
  • numpy中的mean()函数

    mean 函数定义 numpy mean a axis dtype out keepdims mean 函数功能 求取均值 经常操作的参数为axis 以m n矩阵举例 axis 不设置值 对 m n 个数求均值 返回一个实数 axis 0
  • VB联合Python开发

    用到 Python 首先你肯定得装一个Python吧 用3 x的 创建一个 py文件 说明 需要引用pythoncom 这个需要pip install pywin32 import pythoncom class PythonUtiliti
  • R语言缺失值填补

    本文主要介绍如何利用R语言进行数值型缺失值的填补 主要使用zoo包中的na aggregate na approx na locf 函数进行缺失值的均值填补 线性插值填补以及邻近值填补 install packages zoo librar
  • 开源是物联网的驱动力量

    本文转载至 http www infoq com cn articles open source as a driver of internet of things utm campaign infoq content utm source
  • Shell脚本攻略:通配符、正则表达式

    目录 一 理论 1 通配符 2 正则表达式 二 实验 1 通配符 2 正则表达式 一 理论 1 通配符 1 概念 通配符只用于匹配文件名 目录名等 不能用于匹配文件内容 而且是已存在的文件或者目录 各个版本的shell都有通配符 这些通配符
  • 《Android 开发艺术探索》笔记2--IPC机制

    Android 开发艺术探索 笔记2 IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelable接口 Android的几种跨进程的方式 使用Bundl
  • having where 你真的了解了吗?

    where group by group by 字句 和 where条件语句结合在一起使用 当结合在一起时 where在前 group by 在后 即先对select xx from xx的记录集合用where进行筛选 然后再使用group
  • QT 三种关联信号和槽的办法

    1 手动关联 connect ui gt showChildButton QPushButton clicked this MyWidget showChildDialog 2 自动关联 右键单击按钮弹出菜单中选择 转到槽 void MyD
  • Basic Level 1052 卖个萌 (20分)

    题目 萌萌哒表情符号通常由 手 眼 口 三个主要部分组成 简单起见 我们假设一个表情符号是按下列格式输出的 左手 左眼 口 右眼 右手 现给出可选用的符号集合 请你按用户的要求输出表情 输入格式 输入首先在前三行顺序对应给出手 眼 口的可选
  • vue添加水印踩坑

    介绍 前景 app页面添加水印展示 技术实现 watermark dom 完整代码 vue watermark 实现效果 功能描述 添加 删除 更新水印 引入 方式一 推荐 方便拓展 在index html引入相关文件 方式二 npm包引入