jQuery Ajax Data Table

使用 jQuery Ajax 讀取資料表格的簡易實作範例

by San-Kai Liao

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twbs-pagination/1.4.1/jquery.twbsPagination.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-serialize-object/2.5.0/jquery.serialize-object.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--
////////////////
    查詢表單
////////////////
-->

<form class="query-form" method="get" action="https://gist.github.com/search">

  <div>
    name:
    <br>
    <input name="name" type="text" class="query-control">
  </div>

  <div>
    gender:
    <br>
    <select name="gender" class="query-control">
      <option vaule="Male">Male</option>
      <option value="Female">Female</option>
    </select>
  </div>

  <div>
    balance:
    <br>
    <input name="balance_min" type="number" class="query-control" value=""> ~
    <input name="balance_min" type="number" class="query-control" value="">
  </div>

  <!-- page: -->
  <input name="p" type="hidden" class="form-control" value="">


</form>

<!--
////////////////
    分頁器
////////////////    
-->
<ul class="query-pagination" data-total-page="100"></ul>

<!--
////////////////
    資料表格
////////////////    
-->
<table class="query-table table">
  <thead>
    <tr>
      <th>id</th>
      <th>name</th>
      <th>balance</th>
      <th>gender</th>
    </tr>
  </thead>
  <tbody>
    <script id="datarow-template" type="x-tmpl-mustache">
      {{#data}}
      <tr>
        <th>{{ id }}</th>
        <th>{{ name }}</th>
        <th>{{ balance}} </th>
        <th>{{ gender}} </th>
      </tr>
      {{/data }}
    </script>
  </tbody>
</table>

JavaScript

$(document).ready(function() {
  /**
   * 假的資料伺服器
   */
  var $getJSON = null;
  $.ajax({
    async: false,
    url: 'https://www.mockaroo.com/623bbeb0/download?count=1000&key=23e00070'
  }).done(function(fakeData) {
    $getJSON = function(url, params, callback) {
      return callback({
        "data": fakeData
      });
    };
  });


  // 分頁器頁碼改變,就同步更新查詢表單中的頁碼條件
  $('.query-pagination').twbsPagination({
    totalPages: $('.query-pagination').data('total-page'),
    visiblePages: 7,
    onPageClick: function(event, page) {
      $('.query-form').find('input[name="p"]').val(page).trigger('change');
    }
  });

  // 任何查詢條件改變,就送出查詢表單
  $('.query-form').on('change', '.form-control', function(evt) {
    $(evt.currentTarget).parents('.query-form').submit();
  });

  // 收集查詢表單中的條件,以 Ajax 方式送出
  $('.query-form').on('submit', function(evt) {
    evt.preventDefault();
    var url = $(evt.currentTarget).prop('action');
    var params = $(evt.currentTarget).serializeObject();
    var source = $("#datarow-template").html();
    var template = Handlebars.compile(source);

    $getJSON(url, params, function(responseData) {
      $('table.query-table').find('tbody').empty().append(template(responseData));
    });

  });
});