Zooming / Panning Column Chart with Keyboard Arrow Keys | CanvasJS JavaScript Charts

Zooming / Panning Column Chart with Keyboard Arrow Keys | CanvasJS JavaScript Charts

by canvasjs

HTML

<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<div id="chartContainer" style="height: 360px; width: 100%;"></div>

JavaScript

var chart = new CanvasJS.Chart("chartContainer", {
  title: {
    text: "Zooming & Panning Chart with Arrow Keys"
  },
  data: [
    {
      type: "column",
      dataPoints: [
        { x: 10, y: 71 },
        { x: 20, y: 55 },
        { x: 30, y: 50 },
        { x: 40, y: 65 },
        { x: 50, y: 95 },
        { x: 60, y: 68 },
        { x: 70, y: 28 },
        { x: 80, y: 34 },
        { x: 90, y: 14 }
      ]
    }					
  ]
});

chart.render();

var canvas = document.getElementsByClassName("canvasjs-chart-canvas")[1];
var lastDownTarget;

document.addEventListener('mousedown', function(e) {
  lastDownTarget = e.target;
}, false);

document.addEventListener('keydown', function(e) {
  if(lastDownTarget == canvas) {
    var axisX = chart.axisX[0];
    var viewportMin = axisX.get("viewportMinimum"),
        viewportMax = axisX.get("viewportMaximum"),
        interval = axisX.get("minimum");
    var newViewportMin, newViewportMax;

    if (e.keyCode == '38') {// up arrow    
      newViewportMin = viewportMin + interval;
      newViewportMax = viewportMax - interval;
    }
    else if (e.keyCode == '40') {// down arrow
      newViewportMin = viewportMin - interval;
      newViewportMax = viewportMax + interval;
    }
    else if (e.keyCode == '37') {// left arrow
      newViewportMin = viewportMin - interval;
      newViewportMax = viewportMax - interval;
    }
    else if (e.keyCode == '39') {// right arrow
      newViewportMin = viewportMin + interval;
      newViewportMax = viewportMax + interval;
    }

    if(newViewportMin >= chart.axisX[0].get("minimum") && newViewportMax <= chart.axisX[0].get("maximum") && (newViewportMax - newViewportMin) > (2 * interval)){
      chart.axisX[0].set("viewportMinimum", newViewportMin, false);
      chart.axisX[0].set("viewportMaximum", newViewportMax);
    }
  }
}, false);