Datatable Scroller

HTML

<link rel="stylesheet" href="https://cdn.datatables.net/v/dt/dt-1.10.18/sc-1.5.0/datatables.min.css">
<script src="https://cdn.datatables.net/v/dt/jq-3.3.1/dt-1.10.18/datatables.min.js"></script>
<script src="https://nightly.datatables.net/scroller/js/dataTables.scroller.min.js"></script>
<div class="gridview">
  <table class="cell-border">
  </table>
</div>

CSS

div.gridview {
  margin: 0px;
  width: 300px;
  left: 0px;
  top: 0px;
  bottom: 0px;
  z-index: 0;
  display: block;
  visibility: visible;
  overflow: hidden;
  position: absolute;
  padding: 0 !important;
}

JavaScript

$(function() {
  load_table("/echo/json/", "location", "Location");
});

function clone(Obj) {
  var buf;
  if (Obj instanceof Array) {
    buf = []; // create an empty array
    var i = Obj.length;
    while (i --) {
      buf[i] = clone(Obj[i]); // recursively clone the elements
    }
    return buf;
  } else if (Obj instanceof Object) {
    buf = {}; // create an empty object
    for (var k in Obj) {
      buf[k] = clone(Obj[k]); // recursively clone the value
    }
    return buf;
  } else {
    return Obj;
  }
}

function load_table(list_page, column_name, column_label, format_row) {
  var mockdata = {
    result: {
      data: [],
      recordsTotal: 0,
      recordsFiltered: 0
    }
  };
  
  for (var i = 0; i < 500; i++) {
  	mockdata["result"]["data"].push({"location": "location" + i});
  }
  mockdata["result"]["recordsTotal"] =  mockdata["result"]["data"].length;
  mockdata["result"]["recordsFiltered"] =  mockdata["result"]["data"].length;
  
  var table = $('table').DataTable({
    serverSide: true,
    deferRender: true,
    dom: "frtiS",
    scrollX: false,
    scrollY: $("div.gridview").height(),
    scroller: {
      displayBuffer: 10,
    },
    searching: false,
    processing: true,
    select: true,
    info: false,
    bPaginate: true,
    bSearchable: false,
    columns: [{
      "data": column_name,
      "title": column_label
    }],
    order: [],
    data: [],
    ajax: {
      url: list_page,
      type: "POST",
      data: function(d) {
   			 console.log(d);
      	 var mockdata_filter = clone(mockdata);
         mockdata_filter["result"]["data"] =  mockdata_filter["result"]["data"].slice(d.start,d.length);
      	 d.json = JSON.stringify(mockdata_filter);
      },
      dataSrc: function(resp) {
      	console.log(resp.result);
        return resp.result.data;
      }
    },
    fnDrawCallback: function() {}
  });
}