如何使 highchart图表标题文字可选择复制
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图表标题文字可选择复制的更多相关文章
- CSS样式表能否控制文字禁止选择,复制, 焦点
div中禁止文字被选择 在做div的点击计数事件时,遇到一个小问题. 因为div里面有文字,所以当点击多次时,特别是鼠标点的比较快的时候,文字会被选中. 查了下,用css和javascript可以实现 ...
- 不同CSS布局实现与文字鼠标选择的可用性——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2401 一.文字选择的 ...
- phantomjs server + highchart 在服务器端生成highchart图表图片
前言 当项目需要将一个highchart图表以邮件发送的时候,js+css形式的highcharts 图表肯定是不好做的,有查可以借助flash去执行js,但很麻烦,所以折中将highchart图表转 ...
- word标题文字居中浅谈
在Word排版时,要将标题在文档居中,是有区别的,如下图 在回车键后,在选择标题居中,我们常认为标题就是在整个文档居中了,但是实际上只是在回车键到右边区域居中而已,如上图红色方块居中. 只有在标题文字 ...
- 如何使用DAX函数解决动态图表标题
您可能知道,Power BI中的图表(以及许多其他可视化)具有可以设置为任何静态文本的标题.您可以通过选择图表,转到“可视化对象”窗格中的“格式”选项卡,然后更改“标题”部分中的属性(如下所示)来完成 ...
- VC++ 禁止WebBrowser网页跳转时发出的声音和禁止网页上的文字被选择
转载:http://blog.csdn.net/cometnet/article/details/51082091 #include <urlmon.h> #ifndef FEATURE_ ...
- jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏
1.效果及功能说明 hover事件制作产品图片鼠标滑过图片半透明,标题文字从左到右滑动动画移动显示隐藏 2.实现原理 首先把效果都隐藏,然后定义一个伪类来触发所有的效果,接下来当触发伪类后会有一个遍历 ...
- 移除 DevExpress 的 XtraForm 标题文字阴影
问题 在使用 DevExpress 开发 WinForm 程序时,我是使用的默认皮肤进行开发.但客户要求标题栏背景色改为蓝色,标题文字颜色改为白色. 改颜色比较简单,参考了 DevExpress Su ...
- highChart图表
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...
随机推荐
- Windows命令行打开文件夹图形界面
1.打开当前目录 explorer . 2.打开上级目录 explorer .. 3.打开任意目录 explorer dirname
- Android Activity 开发常用技巧整理
1.设置 Activity 背景色为透明 在style.xml里面声明: <style name="TranslucentActivityStyle" parent=&quo ...
- Android 7.0新特性
还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...
- js 常用工具方法
1.格式化字符串 String.prototype.format = function () { let args = arguments; return this.replace(/\{(\d+)\ ...
- vue+hammer.js完美实现长按、左滑,右滑等触控事件
移动端使用手指直接操作的方式大受用户欢迎,这其中就包括了单点.多点.长按.双击等方式. 这么多触控事件,如果开发者自己实现,会浪费大量的时间和精力,快来看看 hammer.js 让我们轻松了多少吧. ...
- Ubuntu 根目录作用
Ubuntu的根目录下存在着很多的文件夹,但你知道他们都存放着哪些文件呢?这些是深入了解Ubuntu系统必不缺少的知识,本文就关于此做一下介绍吧. /bin/ 用以存储二进制可执行命令文件,/u ...
- WindowsServer2003中IIS支持php的配置
1.安装MySQL(没有特殊说明的就按照默认安装)选择 Custom 自定义安装点击"Change"更改 MySQL 安装目录(自定义)其他按照默认的下一步就可以 安装完成后会自动 ...
- react的路由中的switch和exact的使用
刚刚接触react不久,发现在项目中的路由配置中会有switch和exact的使用,现总结如下 switch 为了解决route的唯一渲染(仅仅渲染一个路由路径)出现的 <Switch> ...
- c# 第25节 方法重载
本节内容: 1:方法重载简介 2:方法重载的实现实例 1:方法重载简介 2:方法重载的实现实例 决定方法是否构成重载有三个条件: 1:在同一个类中 2:方法名相同 3:参数列表不同 实例例子: 实现:
- 扎西平措 201571030332 《面向对象程序设计(java)课程学习进度条》
<2019面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序 阅读或编译让我 第一周 20/ ...