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. Python之Beautiful Soup 4使用实例

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航.查找.修改文档的方式.Beautiful Soup 4 官方文档: ...

  2. 原生js利用data选择元素

    //js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...

  3. openresty安装笔记

    目录 安装步骤: openresty安装在ubuntu下的安装 参考 安装OpenResty(Nginx+Lua)开发环境 安装步骤: # 创建目录/usr/servers,以后我们把所有软件安装在此 ...

  4. xml的建模

    xml建模的思路 1.分析需要被建模的文件中有那几个对象 2.每个对象拥有的行为以及属性 3.定义对象从小到大(从里到外) 4.通过23种的设计模式中的工厂模式,解析xml生产出指定对象 建模的好处 ...

  5. linux学习(二)linux系统的安装

    Linux 安装 本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用,参考各大云服务器比较. 本章节以 ce ...

  6. 1. git 基础

    参考文档: https://www.liaoxuefeng.com/wiki/896043488029600 https://git-scm.com/docs/git-fsck 一.介绍 Linus一 ...

  7. Vue入门案例(二)

    创建一个 .html 文件,然后通过如下方式引入 Vue: <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.js ...

  8. 【Eureka篇三】Eureka常用配置说明(7)

    服务注册中心配置(Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean) #关闭注册中心的保护机制, ...

  9. Python进阶-XVI 继承 单继承 多继承

    一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...

  10. 使用threaddump-analyzer 快速查看jvm thread 状态信息

    日常开发中,我们可以需要通过thread dump 查看线程信息,比如锁,spotify 团队提供了一个web 界面,很方便 以下是简单使用,同时添加了docker 支持 添加docker 支持 cl ...