Highstock平移异步加载数据

时间:2013-02-19 14:00:50

标签: javascript charts highcharts highstock

使用Highstock是否可以拖动图表并异步加载数据?

我在highcharts网站http://jsfiddle.net/hcharge/5zPLV/

上看过异步演示

然而,这使用导航器/滚动条沿着系列移动图表并在停止滑动时加载数据。理想情况下我想使用highstock的平移功能来移动而不是导航器,因为它也占用了很大的空间。

如果我关闭导航器和滚动条并禁用zoomtype:x,那么一旦开始拖动图表,它会尝试获取数据,使图表无法使用。这是http://jsfiddle.net/hcharge/6YSvk/

的小提琴
navigator: {enabled: false}, scrollbar: {enabled: false}

理想情况下,我们需要知道用户何时开始拖动以及何时停止然后加载数据。

这甚至可以吗?感谢

2 个答案:

答案 0 :(得分:1)

我认为这是可能的,但这并不容易。

正如你所写,你应该从检测阻力&下降。使用内置选项是不可能的,但我们可以添加自己的事件侦听器。看看这段代码:

new Highcharts.StockChart({
    // here comes your chart options, but we can pass callback function as the second parameter
}, function (chart) {
    var report = document.getElementById('report'), // just an element to display current extremes
        xAxis = chart.xAxis[0],
        startX;

    function drag(e) {
        e = chart.tracker.normalizeMouseEvent(e);
        startX = e.chartX;
    }

    function drop(e) {
        e = chart.tracker.normalizeMouseEvent(e);

        var delta = e.chartX - startX,
            extremes = xAxis.getExtremes(),
            newMin = Math.round(extremes.min - delta),
            newMax = Math.round(extremes.max - delta);

        // display extremes retrieved by panning
        report.innerHTML = "<b>From:</b> " + new Date(newMin) + " <b>to:</b> " + new Date(newMax);
    }

    // bind events
    Highcharts.addEvent(chart.container, 'mousedown', drag);
    Highcharts.addEvent(chart.container, 'mouseup', drop);
});

我们只需检测mouseDown&amp; mouseUp事件,然后计算差异,将差异转换为x数据,最后从极端值中减去差异。

在这里,您可以找到上面发布的代码的jsfiddle演示:http://jsfiddle.net/dSEAA/1/

答案 1 :(得分:0)

要使@slawekkolodziej 的示例工作,您需要将 xAxis 上的 delta 转换为 ms,然后像这样更新 xAxis 极端:

window.chart = new Highcharts.StockChart({
    // chart options go here
}, function(chart) {
    var xAxis = chart.xAxis[0],
        startX;

    function drag(e) {
      e = chart.pointer.normalize(e);
      startX = e.chartX;
    }

    function drop(e) {
      e = chart.pointer.normalize(e);

      var delta = e.chartX - startX,
        extremes = xAxis.getExtremes(),
        deltaMs = (extremes.max - extremes.min) / chart.plotWidth * delta,
        newMin = Math.round(extremes.min - deltaMs),
        newMax = Math.round(extremes.max - deltaMs);

      xAxis.setExtremes(newMin, newMax)
    }

    Highcharts.addEvent(chart.container, 'mousedown', drag);
    Highcharts.addEvent(chart.container, 'mouseup', drop);
  });
});

以下是异步数据加载的工作示例:http://jsfiddle.net/xw7goLj4/5/