ポンクソフト

テーブルにページ送り(ページング)を実装してみる - jQuery入門

前ページ jQuery入門 TOP 次ページ

目次

  1. jQuery入門
  2. jQueryのインストール・簡単な使い方
  3. クイズゲームの作り方
  4. 秘密の暗号を作ってみよう(たぬき暗号)
  5. アクションゲームを作ってみよう(ぬりかべ)
  6. 画像を使ったジグソーパズルを作ってみよう
  7. もぐらたたきっぽいゲーム
  8. ドラッグ可能なポップアップウインドウを作ろう
  9. jQuery UI Sortableで1ラインオセロゲーム
  10. ブラウザ全体をブロックしてみる
  11. Geolocation APIを使って都道府県のセレクトボックスを現在地に近い順にソートする
  12. 発生したイベントの状態を保持・保存する6つのパターン
  13. Ajaxを利用したシンプルなイメージギャラリーを作ってみる
  14. テーブルにページ送り(ページング)を実装してみる
  15. jQuery UI Draggableを使って付箋(sticky)を作ってみる
  16. カラムでソートできるテーブルを自作してみる
  17. テーブルを使ったシンプルなドット絵エディタを作ってみる
  18. iPhoneのようにマウスではじいてスクロール(フリックスクロール)を実装してみる
  19. テキストフィールドの数値をマウスの上下移動で増減する
  20. iPhoneのように大きい画像の表示領域をマウスのドラッグで移動してみる
  21. iPhoneのように画像をダブルクリックした地点を中心に拡大縮小する
  22. リアルタイムプレビュー付きのHTMLエディタを作ろう
  23. 保存できる付箋を作ってみる(Cookie、localStorage)

ページング

大量の行が並んだテーブルは見づらいものです。そんなときもjQueryを使うと、とても簡単にページ送りを実装することができます。そんなわけでよくあるページ送りを作ってみたわけですが、今回も車輪の再発明です。

ページ送りのデモ

左右の矢印をクリックするとページ送りできます。テーブルのネタはドラクエ9の魔法です。

実行結果

ソース

trの行が長いので省略してあります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<title>jQueryによるテーブルのページ送り</title>
<script>
$(function() {
  var page = 0;
  function draw() {
    $('#page').html(page + 1);
    $('tr').hide();
    $('tr:first,tr:gt(' + page * 10 + '):lt(10)').show();
  }
  $('#prev').click(function() {
    if (page > 0) {
      page--;
      draw();
    }
  });
  $('#next').click(function() {
    if (page < ($('tr').size() - 1) / 10 - 1) {
      page++;
      draw();
    }
  });
  draw();
});
</script>
<style>
td, th {
  border: 1px solid black;
  padding: 2px;
}
#prev, #next {
  color: red;
  cursor: pointer;
}
</style>
</head>
<body>
<span id="prev"><</span> <span id="page"></span> <span id="next">></span>
<table>
<tr><th>名前</th><th>消費MP</th></tr>
<tr><td>メラ</td><td>2</td></tr>
<tr><td>メラミ</td><td>6</td></tr>

・・・・・中略・・・・・

<tr><td>リレミト</td><td>3</td></tr>
<tr><td>トラマナ</td><td>2</td></tr>
</table>
</body>
</html>

プログラムの解説

実際はテーブルの全ての行が表示されているのですが、現在表示すべき10行を可視化、その他の行を不可視とすることによってページ送りがされているように見せかけています。
var page = 0;
現在表示しているページ番号です(0が先頭ページ)。レキシカル変数なので$(document).ready関数が終了した後もclickイベントなどの内部で有効になります。
function draw() {
  ・・・
}
描画処理は「ページを開いたとき」「<を押したとき」「>を押したとき」の3箇所で呼ばれるのでdraw関数としてまとめてあります。
$('#page').html(page + 1);
draw関数ではまず、現在のページ数を
<span id="page"></span>
の要素内に書き込んでいます。次に
$('tr').hide();
テーブル全体を隠し、
$('tr:first, tr:gt(' + page * 10 + '):lt(10)').show();
対象となる10行だけを表示しています。「tr:first」は最初のtr要素、すなわちテーブルのヘッダ部分なので、常に表示対象となります。それに加えて「tr:gt(' + page * 10 + ')」でtr要素の最初から page * 10 番目以降の要素を取り出し、さらにその中から「:lt(10)」で10番目以前の要素を取り出しています。
$('#prev').click(function() {
  if (page > 0) {
    page--;
    draw();
  }
});
「<」が押されたときの処理です。最初のページでなければページ番号をひとつ減らし、画面を描画します。
$('#next').click(function() {
  if (page < ($('tr').size() - 1) / 10 - 1) {
    page++;
    draw();
  }
});
「>」が押されたときの処理です。最後のページでなければページ番号をひとつ増やし、画面を描画します。「$('tr').size()」で要素数が取得できるので、そこから最後のページであるかどうかを計算しています。

まとめ

このように、jQueryを使えば一見複雑そうなページ送りもシンプルに実装することができます。サーバサイドの言語と組み合わせてAjaxを使えば十分実務にも使うことができます。
前ページ jQuery入門 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:



あああ
2017/02/12 19:10

名無しのリーク
香川県ルー餃子のフジフーヅはバイトにパワハラの末指切断の重傷を負わせた犯罪企業
2017/01/26 03:04


あああああ
2017/01/20 17:43

カワカワ
ああああああああ
2017/01/16 08:48

fsfさ
dふぁfだs
2017/01/05 19:56

ああ
あああ
2016/11/09 18:25

test
サンプル
2016/11/08 16:42

セレクタの指定方法を返る
HTML部分
~~~~
<div>問題1</div>
<p>
<input type="radio" name="food" value="1">そば
<input type="radio" name="food" value="2">うどん
<input type="radio" name="food" value="3">ラーメン
</p>

<div>問題2</div>
<p>
<input type="radio" name="food01" value="1">いか
<input type="radio" name="food01" value="2">たこ
<input type="radio" name="food01" value="3">えび
<input type="radio" name="food01" value="4">えび
</p>
2016/11/08 14:31

セレクタの指定方法を返る
>教えてくださいさん
セレクタの指定方法をinputからnameに変える方法はいかがでしょうか。

//問題1
$(function() {
$("*[name=food]").click(function() {
if($(this).val()==2)
{
alert('正解');
}
});
});

//問題2
$(function() {
$("*[name=food01]").click(function() {
if($(this).val()==2)
{
alert('正解');
}
});
});
2016/11/08 14:31



2016/10/31 11:32

残りを読む »