使用Highstock是否可以拖动图表并异步加载数据?
我在highcharts网站http://jsfiddle.net/hcharge/5zPLV/
上看过异步演示然而,这使用导航器/滚动条沿着系列移动图表并在停止滑动时加载数据。理想情况下我想使用highstock的平移功能来移动而不是导航器,因为它也占用了很大的空间。
如果我关闭导航器和滚动条并禁用zoomtype:x,那么一旦开始拖动图表,它会尝试获取数据,使图表无法使用。这是http://jsfiddle.net/hcharge/6YSvk/
的小提琴navigator: {enabled: false}, scrollbar: {enabled: false}
理想情况下,我们需要知道用户何时开始拖动以及何时停止然后加载数据。
这甚至可以吗?感谢
答案 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/