highchart图表的一个常见问题是不能复制文字

比如官网的某个图表例子,文字不能选择,也无法复制,有时产品会抓狂...

本文给出一个简单的方案,包括一些解决的思路,希望能帮助到有需要的人

初期想了蛮久也搜了蛮多,没搜到,找到的结论是图表使用的是svg实现,必然无法选择文字,似乎是个死问题,已经濒临放弃

不过后来又看到一篇讨论,其实svg里面的文字是可以选择复制的

顿时信心又来了,展开了新一轮思考

思考一:可能是姿势不对

试试把标题配成 useHTML: true ,使用普通元素渲染,结果还是无法选

看看DOM结构,实际上已经和svg无关了

思考二:会不会是设置了某些样式呢

跟选择复制有关的也就这俩了,直接赋上去,还是无效

思考三:会不会是有事件影响,取消了点击选择效果呢

为了测试的简便与纯粹性,最好直接使用官方提供的简单例子

查看元素对应的事件列表,有几个需要关注

选择highchart.js ,跳的不准呀,代码混淆之后貌似chrome的跳转一致都不太可靠了

思考四:什么js东西使得点击选择无效呢

可能是事件禁止了冒泡 stopPropagation,或者是取消了元素的事件默认处理机制 preventDefault

一搜,发现前者没找到,而后者有多处

定位到一个 mouseDown事件触发的位置,柳暗花明的感觉

试了一下可以发现,上下两处是关键点,直接造成文字选择功能失效了(当然这可能是作者的本意)

接下来就是验证环节,把这文件下下来本地,改好后(注释那俩地方)用Fiddler的文件映射功能,替换这个例子中的 highchart.js,妥妥的可以进行选择复制

思考五:如何运用在业务代码中?

在vue中使用的是npm的包管理,所以肯定不能直接改源代码,可选的一个方案是覆盖源代码,即覆盖这两个方法

    import Highcharts from "highcharts";

    // 重写Highcharts事件处理,使得内容可选择复制
Highcharts.Pointer.prototype.onContainerMouseDown = function(a) {
a = this.normalize(a);
2 !== a.button && (this.zoomOption(a),
// a.preventDefault && a.preventDefault(),
this.dragStart(a))
}; Highcharts.Pointer.prototype.onContainerMouseMove = function(b) {
// 整理变量
let a = Highcharts;
let B = Highcharts.charts;
let q = function(a) {
return "undefined" !== typeof a && null !== a
}; var c = this.chart;
q(a.hoverChartIndex) && B[a.hoverChartIndex] && B[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);
b = this.normalize(b);
// b.preventDefault || (b.returnValue = !1);
"mousedown" === c.mouseIsDown && this.drag(b);
!this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
};

找到对象是谁,这一步可以断点调试看this,或往上翻代码,其实是个Pointer.

通过分析可知,这个对象的Highcharts对象的一个子对象,我们也需要通过简单的判断来进行确认好

需要注意的是,代码中有一段用到了其他变量 q  B  a,所以在业务代码中覆盖的时候,我们需要另外提前赋值

q(a.hoverChartIndex) && B[a.hoverChartIndex] && B[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);

通过一系列分析和断点查询,以及确认值的一致,就能保证能覆盖地正确

思考六:在vue中为何没有生效

然鹅并不是顺利的,在实际场景vue-highcharts中使用竟然没啥变化,一轮调试下来也没有走断点,

无可奈何只好去看下它的实现,看有没有什么突破口

源码很少,就是一层包装

但这里可以发现,如果没有传入highcharts,就会另外引入npm包来使用

所以很大可能是没传入这个属性,致使覆盖的Pointer并不是真正的图表Pointer

仔细检查代码,才发现前人留个个坑,把大写的属性改成小写之后,即可匹配上

当然,这个覆盖的方式是挺暴力的,可以根据需求加些判断处理,不过在现有业务中,不失为一个好办法

如何使 highchart图表标题文字可选择复制的更多相关文章

  1. CSS样式表能否控制文字禁止选择,复制, 焦点

    div中禁止文字被选择 在做div的点击计数事件时,遇到一个小问题. 因为div里面有文字,所以当点击多次时,特别是鼠标点的比较快的时候,文字会被选中. 查了下,用css和javascript可以实现 ...

  2. 不同CSS布局实现与文字鼠标选择的可用性——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2401 一.文字选择的 ...

  3. phantomjs server + highchart 在服务器端生成highchart图表图片

    前言 当项目需要将一个highchart图表以邮件发送的时候,js+css形式的highcharts 图表肯定是不好做的,有查可以借助flash去执行js,但很麻烦,所以折中将highchart图表转 ...

  4. word标题文字居中浅谈

    在Word排版时,要将标题在文档居中,是有区别的,如下图 在回车键后,在选择标题居中,我们常认为标题就是在整个文档居中了,但是实际上只是在回车键到右边区域居中而已,如上图红色方块居中. 只有在标题文字 ...

  5. 如何使用DAX函数解决动态图表标题

    您可能知道,Power BI中的图表(以及许多其他可视化)具有可以设置为任何静态文本的标题.您可以通过选择图表,转到“可视化对象”窗格中的“格式”选项卡,然后更改“标题”部分中的属性(如下所示)来完成 ...

  6. VC++ 禁止WebBrowser网页跳转时发出的声音和禁止网页上的文字被选择

    转载:http://blog.csdn.net/cometnet/article/details/51082091 #include <urlmon.h> #ifndef FEATURE_ ...

  7. jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏

    1.效果及功能说明 hover事件制作产品图片鼠标滑过图片半透明,标题文字从左到右滑动动画移动显示隐藏 2.实现原理 首先把效果都隐藏,然后定义一个伪类来触发所有的效果,接下来当触发伪类后会有一个遍历 ...

  8. 移除 DevExpress 的 XtraForm 标题文字阴影

    问题 在使用 DevExpress 开发 WinForm 程序时,我是使用的默认皮肤进行开发.但客户要求标题栏背景色改为蓝色,标题文字颜色改为白色. 改颜色比较简单,参考了 DevExpress Su ...

  9. highChart图表

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

随机推荐

  1. Vue实战狗尾草博客管理平台第六章

    Vue实现狗尾草博客后台管理系统第六章 本章节内容 文章列表 文章详情 草稿箱 文章发布. 本章节内容呢,开发的很是随意哈,因为多数就是element-ui的使用,熟悉的童鞋,是可以很快完成本章节的内 ...

  2. [转]HotSpot VM GC 的种类

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037029.html collector种类 GC在 HotSpot VM 5.0里 ...

  3. 比hive快10倍的大数据查询利器presto部署

    目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...

  4. dockerfile和资源限制(五)

    镜像生成途径 dockerfile 基于容器制作 什么是dockerfile dockerfile说白就是用来构建docker 镜像的源码,大家看到源码俩字不用惊慌,所为的dockerfile源码只是 ...

  5. 运行输出时候遇到了Json.Disosi@3fa77460格式·

    比如我的运行输出时候遇到了Json.Disosi@3fa77460这种类路径+@+储存空间编码格式 发现是实体类忘记加了toString方法 使用ALT+ins快捷键点击toString()方法 再运 ...

  6. 【BZOJ2655】calc(拉格朗日插值)

    bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...

  7. git笔录

    [一]git介绍 初始的项目版本管理可以在本地赋值备份之前版本代码,项目较小时还可以,但项目较大时,这种方法显得有点捉襟见肘 ... ... 后期也出现了很多版本管理工具,例如svn.vcs.vss等 ...

  8. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

  9. c 和 c++ 啊 Make

  10. windows 10 下安装VMware Workstation Pro 15.0(亲测可用!)

    参考链接:https://blog.csdn.net/qq_39016934/article/details/90285915 VMware Workstation Pro 15.0的下载官网:htt ...