You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用highcharts-draggable拖拽点时触发TypeError错误求助

Highcharts draggable-points拖拽释放时抛出TypeError问题解决

问题场景

使用highcharts-draggable实现自定义拖拽功能,由于无现成方案,设置了两个关联系列:一个包含多数据点的折线系列,一个仅含单个散点的系列(用于在折线上显示特殊值),核心逻辑是限制拖拽操作仅在折线上进行。拖拽过程运行正常,但释放拖拽(drop)时,Highcharts抛出如下错误:

Uncaught TypeError: Cannot read properties of undefined (reading 'chart')

错误堆栈信息:

Uncaught TypeError: Cannot read properties of undefined (reading 'chart')
    at C.update (highcharts.js?v=edf679bd:2858:69)
    at C.drop (TorqueTurnChart.tsx?t=1711529095151:134:18)
    at highcharts.js?v=edf679bd:163:31
    at Array.forEach (<anonymous>)
    at C (highcharts.js?v=edf679bd:162:64)
    at C.firePointEvent (highcharts.js?v=edf679bd:2781:17)
    at v (highcharts_modules_draggable-points.js?t=1711446888273&v=edf679bd:86:100)
    at e3.unbindDragDropMouseUp.s.passive (highcharts_modules_draggable-points.js?t=1711446888273&v=edf679bd:175:15)

原代码片段

dragStart: function(e: Highcharts.PointDragStartEventObject) {
                this.update({visible: false});
                this.series.addPoint({x:0, y: 0}, true);
            },
            drag: (e: Highcharts.PointDragEventObject) => {
                const {x, series, index} = e.target;
                const torqueSeries = series.linkedSeries[0];
                let y;
                for (let i = torqueSeries.xData.length - 1; i--;) {
                    if (torqueSeries.xData[i] < x) {
                        y = range(torqueSeries.xData[i], torqueSeries.xData[i + 1], torqueSeries.yData[i], torqueSeries.yData[i + 1], x);
                        break;
                    }
                }
                series.getValidPoints()[0].update({x, y}, true);
            },
            drop: (e: Highcharts.PointDropEventObject) => {
                const {x, series} = e.target;
                const torqueSeries = series.linkedSeries[0];
                let y;
                for (let i = torqueSeries.xData.length - 1; i--;) {
                    if (torqueSeries.xData[i] < x) {
                        y = range(torqueSeries.xData[i], torqueSeries.xData[i + 1], torqueSeries.yData[i], torqueSeries.yData[i + 1], x);
                        break;
                    }
                }
                series.removePoint(1, false);
                e.target.update({x, y, visible: true}, true);
                e.preventDefault();
            }

问题原因与修复方案

排查后确认,drop事件中的series.removePoint(1, false)是多余操作:该操作会导致后续执行e.target.update()时,目标点已脱离图表上下文,从而触发Cannot read properties of undefined (reading 'chart')错误。

移除该多余的点移除操作后,代码运行恢复正常。修正后的drop事件代码如下:

drop: (e: Highcharts.PointDropEventObject) => {
    const {x, series} = e.target;
    const torqueSeries = series.linkedSeries[0];
    let y;
    for (let i = torqueSeries.xData.length - 1; i--;) {
        if (torqueSeries.xData[i] < x) {
            y = range(torqueSeries.xData[i], torqueSeries.xData[i + 1], torqueSeries.yData[i], torqueSeries.yData[i + 1], x);
            break;
        }
    }
    e.target.update({x, y, visible: true}, true);
    e.preventDefault();
}

内容的提问来源于stack exchange,提问作者bemol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:28