【问题标题】:How to render a vertical line on hover in chartjs如何在chartjs中悬停时呈现垂直线
【发布时间】:2017-08-29 16:54:01
【问题描述】:

当我将鼠标悬停在 chartjs v2 的绘图区域上时,我试图渲染一条垂直线。我有一个基本的工作版本,但我还没有弄清楚每次画线时如何删除线(旧线只是保留)。

这是一个工作示例 - https://jsfiddle.net/s9gyynxp/5/

var ctx = document.getElementById("myChart");
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3]
        }]
    }
});

// Hook into main event handler
var parentEventHandler = Chart.Controller.prototype.eventHandler;
Chart.Controller.prototype.eventHandler = function() {
    var ret = parentEventHandler.apply(this, arguments);

    // Draw the vertical line here
    var eventPosition = Chart.helpers.getRelativePosition(arguments[0], this.chart);
    this.chart.ctx.beginPath();
    this.chart.ctx.moveTo(eventPosition.x, 30);
    this.chart.ctx.strokeStyle = "#ff0000";
    this.chart.ctx.lineTo(eventPosition.x, 340);
    this.chart.ctx.stroke();

    return ret;
};

注意我已经看到了其他解决方案,其中在图表画布顶部使用了第二个画布层 - 我认为这不是我的选择,因为我需要垂直线出现在图表顶部,但在我将实施的自定义工具提示下方。

任何建议都非常感谢,谢谢!

【问题讨论】:

    标签: javascript chart.js


    【解决方案1】:

    在画线之前添加以下几行

    ...
    this.clear();
    this.draw();
    ...
    

    顺便说一句,你的线不会一直延伸到底部。如果您想让它一直向下延伸,请使用 0this.chart.height 作为您的 yStart 和 yEnd。或者您可以使用 y 轴刻度来计算刻度的最大和最小像素(请参阅https://jsfiddle.net/ombaww9t/)。


    小提琴 - https://jsfiddle.net/56s9av1j/

    【讨论】:

    • 知道如何使用 Chart.js 2.6.0 完成此任务吗?
    • 我得到这个 - 无法在 Object.helpers.getRelativePosition 读取未定义的属性(读取'getBoundingClientRect')
    【解决方案2】:

    2.6.0 的工作版本(将 'y-axis-0' 更改为 y 轴的 id)

    // Hook into main event handler
    let parentEventHandler = Chart.Controller.prototype.eventHandler;
    Chart.Controller.prototype.eventHandler = function () {
        let ret = parentEventHandler.apply(this, arguments);
    
        let x = arguments[0].x;
        let y = arguments[0].y;
        this.clear();
        this.draw();
        let yScale = this.scales['y-axis-0'];
        this.chart.ctx.beginPath();
        this.chart.ctx.moveTo(x, yScale.getPixelForValue(yScale.max));
        this.chart.ctx.strokeStyle = "#ff0000";
        this.chart.ctx.lineTo(x, yScale.getPixelForValue(yScale.min));
        this.chart.ctx.stroke();
    
        return ret;
    };
    

    【讨论】:

    • 你碰巧知道如何在 chartjs v3 上做同样的事情吗?
    • 我终于成功了。我所做的是将Chart.Controller.prototype.eventHandler更改为Chart.prototype._eventHandler,然后将let yScale = this.scales['y-axis-0']更改为let yScale = this.scales.y,然后将每个this.chart.ctx更改为this.ctx,最后添加0作为getPixelForValue()的第二个参数:yScale.getPixelForValue(yScale.max, 0) (另一个相同)。非常感谢您提供的示例。
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多