news 2026/6/23 19:25:29

Highcharts 扩展开发 文档说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Highcharts 扩展开发 文档说明

Highcharts 扩展开发

自版本2.3起,Highcharts采用模块化设计,便于扩展。

  • 主要的图表概念对应于 JavaScript 的原型或“类”,这些类在 Highcharts 命名空间中显示出来,且可以方便地进行修改。例如Highcharts.Series,Highcharts.Tooltip,Highcharts.Chart,Highcharts.Axis,Highcharts.Legend等。查看 完整列表 的类。
  • 构造函数的逻辑因此被保留在一个方法中,init,以便覆盖初始化过程。
  • 添加事件可以通过addEvent:
    Highcharts.addEvent(chart, 'load', someFunction);
  • 一些原型和属性列在 api.highcharts.com 上,但并非全部。未列出的原型和属性意味着它们可能会在未来的版本中发生变化,因为我们在优化和调整库。我们并不反对使用这些成员,但提醒您,您的插件应在未来版本的 Highcharts 中进行测试。可以通过检查 Highcharts 命名空间以及开发者工具中生成的图表对象,或者研究highcharts.src.js的源代码来识别这些成员。

封装一个插件

Highcharts插件应当包裹在一个匿名自执行函数中,以防止变量污染全局作用域。一个好的做法是这样包裹插件:

(function(H){const{Chart,Series}=H;// shortcuts to Highcharts classesletlocalVar;// local variabledoSomething();}(Highcharts));

在图表初始化时加载扩展

事件可以添加到类和实例中。为了在每个图表上都初始化扩展,可以在Chart类上添加一个事件监听器。

H.addEvent(H.Chart,'load',function(e){constchart=e.target;H.addEvent(chart.container,'click',function(e){e=chart.pointer.normalize(e);console.log(`Clicked chart at${e.chartX},${e.chartY}`);});H.addEvent(chart.xAxis[0],'afterSetExtremes',function(e){console.log(`Set extremes to${e.min},${e.max}`);});});

上手试一试

封装原型函数

JavaScript 具有极强的动态特性,在实时修改脚本行为方面非常强大。在 Highcharts 中,我们创建了一个名为wrap的工具,它可以包装现有的原型方法(“方法”),允许你在其前后添加自己的代码。

wrap函数的第一个参数是父对象,第二个参数是要包裹的函数名,第三个参数是一个回调替代函数。原始函数作为第一个参数传递给替代函数,原始参数紧随其后。

代码示例:

H.wrap(H.Series.types.line.prototype,'drawGraph',function(proceed){// Before the original functionconsole.log("We are about to draw the graph: ",typeofthis.graph);// Now apply the original function with the original arguments,// which are sliced off this function's argumentsproceed.apply(this,Array.prototype.slice.call(arguments,1));// Add some code after the original functionconsole.log("We just finished drawing the graph: ",typeofthis.graph);});

上手试一试

在加载ES模块时,可以 直接访问模块 。

扩展示例

案例:客户希望在Highcharts Stock的柱状系列中使用标记(“轨迹球”)。目前,标记功能仅支持线性系列。为了实现这个功能,可以编写一个小插件。

这个插件会在每个系列中添加一个轨迹球,前提是该系列尚未支持或包含标记。

为此,我们从以下代码开始,创建一个自执行函数来包含这个插件:

(function(H){// This is a self executing function// The global variable Highcharts is passed along with a reference H}(Highcharts));

之后,我们需要为Tooltip.prototype.refreshTooltip.prototype.hide方法添加额外的功能。为此,我们会对这些方法进行包装:

(function(H){H.wrap(H.Tooltip.prototype,'refresh',function(proceed,points){// When refresh is called, code inside this wrap is executed});}(Highcharts));

当调用刷新时,我们希望它在每个系列的当前点上绘制一个轨迹球。如果某个系列已经包含标记,则应跳过此功能。

H.wrap(H.Tooltip.prototype,'refresh',function(proceed,points){// Run the original proceed methodproceed.apply(this,Array.prototype.slice.call(arguments,1));// For each point add or update trackballH.each(points,function(point){// Function variablesvarseries=point.series,chart=series.chart,pointX=point.plotX+series.xAxis.pos,pointY=H.pick(point.plotClose,point.plotY)+series.yAxis.pos;// If trackball functionality does not already existif(!series.options.marker){// If trackball is not definedif(!series.trackball){// Creates a new trackball with same color as the seriesseries.trackball=chart.renderer.circle(pointX,pointY,5).attr({fill:series.color,stroke:'white','stroke-width':1,zIndex:5}).add();}else{// Updates the position of the trackballseries.trackball.attr({x:pointX,y:pointY});}}});});

现在轨迹球会显示出来,但我们还需要在工具提示被移除时将其隐藏。因此,隐藏方法中也需要添加一些额外的功能。在包含插件的函数内部添加了一个新的包装:

H.wrap(H.Tooltip.prototype,'hide',function(proceed){varseries=this.chart.series;// Run original proceed methodproceed.apply(this);// For each series destroy trackballH.each(series,function(serie){vartrackball=serie.trackball;if(trackball){serie.trackball=trackball.destroy();}});});

就是这些, 整个示例可以在jsFiddle中查看 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 14:07:34

大模型量化技术原理-ZeroQuant系列(一)

简单的看第一篇,这个系列目前有四篇左右,感兴趣可以去搜搜 ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale TransformersZeroQuant-V2: Exploring Post-training Quantization in LLMs from Comprehensive Study to …

作者头像 李华
网站建设 2026/6/22 22:11:13

RISCV的异常和中断

常规控制流:程序正常执行的指令流向,通过branch(条件分支)、jump(无条件跳转)指令改变执行顺序,是处理器的常规工作状态。异常控制流(ECP):打破常规控制流的特…

作者头像 李华
网站建设 2026/6/22 11:24:16

vue基于Spring Boot框架的水果商城设计与实现_6628xfyb_

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/23 10:20:32

【入门级-数据结构-3、特殊树:完全二叉树的定义与基本性质】

一、完全二叉树的严格定义 完全二叉树(Complete Binary Tree)是二叉树中极具规律性的特殊结构。 完全二叉树需满足两个核心条件: 除最后一层外,每一层的节点数都达到最大值(即第k层有2^(k-1)个节点,k≥1&am…

作者头像 李华
网站建设 2026/6/23 10:28:12

python用openpyxl操作excel-读取或创建excel文件

python用openpyxl操作excel-读取或创建excel1,读取 excel 文件返回 workbook 对象def excel_read(file_path):""" 读取Excel文件返回workbook对象 """if not os.path.exists(file_path):logger.error(f文件{file_path}不存在)return …

作者头像 李华
网站建设 2026/6/23 18:22:20

刷题日记day5(二分+前缀和)

题目描述 蒟蒻的第五篇博客希望大家支持 1314聪明的质检员 P1314 [NOIP 2011 提高组] 聪明的质监员 题目描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 nnn 个矿石,从 111 到 nnn 逐一编号,每个矿石都有自己的重…

作者头像 李华