ページナビのオブジェクトのサンプル

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ページナビのオブジェクトのサンプル</title>
  6. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  7. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  8. <style type="text/css">
  9. * {
  10.   font-family: "メイリオ";
  11.   font-size: 10pt;
  12. }
  13. table {
  14.   border-collapse:collapse;
  15.   margin:0;
  16. }
  17. th, td {
  18.   text-align:left;
  19.   vertical-align:top;
  20.   padding:3px;
  21.   font-weight:normal;
  22.   border:1px solid #ccc;
  23. }
  24. th {
  25.   background:#f0f0f0;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <h1>ページナビのオブジェクトのサンプル</h1>
  31. <script type="text/javascript">
  32.   var PageNaviClass = function (_total) {
  33.     /// <summary>
  34.     /// ページナビのオブジェクト
  35.     /// 
  36.     /// _total: ページ総数
  37.     /// 
  38.     /// ex. 総ページ数が9ページのとき
  39.     ///  - カレントページが「1」のとき:「  [1] 2  3  4  5  >」
  40.     ///  - カレントページが「2」のとき:「   1 [2] 3  4  5  >」
  41.     ///  - カレントページが「3」のとき:「   1  2 [3] 4  5  >」
  42.     ///  - カレントページが「4」のとき:「<  2  3 [4] 5  6  >」
  43.     ///  - カレントページが「5」のとき:「<  3  4 [5] 6  7  >」
  44.     ///  - カレントページが「6」のとき:「<  4  5 [6] 7  8  >」
  45.     ///  - カレントページが「7」のとき:「<  5  6 [7] 8  9   」
  46.     ///  - カレントページが「8」のとき:「<  5  6  7 [8] 9   」
  47.     ///  - カレントページが「9」のとき:「<  5  6  7  8 [9]  」
  48.     /// ※ 前・次があるときは、カレントページの前後、無ければ「0」
  49.     /// </summary>
  50.     
  51.     var self = this;
  52.     
  53.     var navView = 5;  // 表示したいページナビゲーション数
  54.     var navTotal = 0; // 総ページ数
  55.     
  56.     self.setNaviView = function (_view) {
  57.       /// <summary>
  58.       /// 表示したいページ数の変更
  59.       ///
  60.       /// _view: 表示したいページ数
  61.       /// </summary>
  62.       
  63.       navView = _view || navView;
  64.     }
  65.     
  66.     self.getNaviObj = function (_cur) {
  67.       /// <summary>
  68.       /// ページナビで使う各種データオブジェクトの取得
  69.       ///
  70.       /// _cur: 表示したいページ番号
  71.       /// </summary>
  72.       
  73.       _cur = parseFloat(_cur) || 1;
  74.       
  75.       if(_cur <= 0){
  76.         _cur = 1;
  77.       }
  78.       
  79.       if (navTotal < _cur) {                        // 総ページ数を上回るページを表示しようとした場合
  80.         _cur = navTotal;
  81.       }
  82.       
  83.       var _result = ({});
  84.       _result.All = navTotal;                       // 総ページ数
  85.       _result.Pre = _cur - 1;                       // 前ページ
  86.       _result.Nxt = _cur + 1;                       // 次ページ
  87.       _result.Cur = _cur;                           // 現在のページ
  88.       _result.Vie = new Array();                    // 表示するページ
  89.       
  90.       var _bgn = 1;                                 // 表示するページナビの最初
  91.       var _end = _bgn + navView;                    // 表示するページナビの最後
  92.       
  93.       var _center = Math.floor(navView / 2);
  94.       
  95.       if (navTotal <= navView) {                    // 表示するページ数がページ総数より少ないとき
  96.         // 前・次ページは不要
  97.         _result.Pre = 0;
  98.         _result.Nxt = 0;
  99.         
  100.         // 総ページ数がページの最後
  101.         _end = navTotal + 1;
  102.       }
  103.       else {
  104.         if (navTotal <= _cur) {                   // カレントページがページ総数より多いとき
  105.           // 次ページは不要
  106.           _result.Nxt = 0;
  107.           
  108.           // ページ総数が最後になるようにページナビの最初を設定
  109.           _bgn = navTotal - (navView - 1);
  110.           
  111.           // 最後のページをカレントページに設定
  112.           _cur = navTotal;
  113.         }
  114.         else if (_cur <= _center) {               // カレントページが最初の方
  115.           // 前ページは不要
  116.           _result.Pre = 0;
  117.         }
  118.         else if (navTotal - _center <= _cur) {    // カレントページが最後の方
  119.           // 次ページは不要
  120.           _result.Nxt = 0;
  121.           
  122.           // ページ総数が最後になるようにページナビの最初を設定
  123.           _bgn = navTotal - (navView - 1);
  124.         }
  125.         else {
  126.           _bgn = _cur - _center;
  127.         }
  128.         
  129.         // 最後のページを再設定
  130.         _end = _bgn + navView;
  131.       }
  132.       
  133.       for (var i = _bgn; i < _end; i++) {
  134.         _result.Vie.push(i);
  135.       }
  136.       
  137.       return _result;
  138.     }
  139.   
  140.     self.initialize = function (_total) {
  141.       /// <summary>
  142.       /// コンストラクタ
  143.       ///
  144.       /// _total: 総ページ数
  145.       /// </summary>
  146.       
  147.       navTotal = parseFloat(_total) || navTotal;
  148.     }
  149.     
  150.     self.initialize(_total);
  151.   }
  152.   
  153.   var ViewModel = function () {
  154.     var self = this;
  155.     
  156.     self.pageNavi = ko.observable(null);
  157.     self.all = ko.observable(90);
  158.     self.cur = ko.observable(1);
  159.     
  160.     self.movePage = function(data) {
  161.       var all = parseFloat(self.all());
  162.       var pnObj = new PageNaviClass(all);
  163.       
  164.       var cur = parseFloat(self.cur());
  165.       var pageNavi = pnObj.getNaviObj(cur);
  166.       
  167.       self.pageNavi(pageNavi);
  168.     }
  169.     
  170.     self.movePage();
  171.   }
  172.   
  173.   $(document).ready(function () {
  174.     ko.applyBindings(new ViewModel());
  175.   });
  176. </script>
  177. <table data-bind="with: pageNavi">
  178. <tr><th>総ページ数</th><td><input type="text" data-bind="value: $root.all" style="width:100px;" /></td></tr>
  179. <tr><th>表示するページ</th><td><input type="text" data-bind="value: $root.cur" style="width:100px;" /></td></tr>
  180. <tr><th colspan="2"><button data-bind="click: $root.movePage">↓変更↓</button></th></tr>
  181. </table>
  182. <table data-bind="with: pageNavi" style="margin-top:10px;">
  183. <thead>
  184.   <tr>
  185.   <th>項目名</th>
  186.   <th>要素名?</th>
  187.   <th>値</th>
  188.   </tr>
  189. </thead>
  190. <tbody>
  191.   <tr><th>総ページ数</th><th>All</th><td data-bind="text: All"></td></tr>
  192.   <tr><th>カレントページ</th><th>Cur</th><td data-bind="text: Cur"></td></tr>
  193.   <tr><th>前</th><th>Pre</th><td data-bind="text: Pre"></td></tr>
  194.   <tr><th>表示するページナビゲーション</th><th>Vie(配列)</th><td data-bind="foreach: Vie"><span data-bind="text: $data + ' | '"></span></td></tr>
  195.   <tr><th>次</th><th>Nxt</th><td data-bind="text: Nxt"></td></tr>
  196. </tbody>
  197. </table>
  198. <p>前・次の値が「0」のときは「何もない」という扱い</p>
  199. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  200. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  201. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  202. </div>
  203. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  204. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  205. </div>
  206. </body>
  207. </html>