クリックしたカラムでソート2

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>クリックしたカラムでソート2</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. <script type="text/javascript">
  9.   $(document).ready(function () {
  10.     function viewModel() {
  11.       var self = this;
  12.       // 表示するデータ群をいれる変数(?)
  13.       self.tourism = ko.observableArray();
  14.       // 表示するデータ
  15.       self.tourism([
  16.         { local: '九州地方', area: '太宰府', kind: '歴史遺産', description: '太宰府天満宮、大宰府政庁跡。', },
  17.         { local: '東北地方', area: '大仙市', kind: '文化・自然・温泉', description: '大曲花火大会、秋ノ宮温泉郷など。', },
  18.         { local: '北海道', area: '七飯', kind: '自然・保養', description: '大沼・小沼などの大沼国定公園、流山温泉。', },
  19.         { local: '沖縄地方', area: '恩納', kind: '保養地・自然', description: 'ビーチリゾート、万座毛。', },
  20.         { local: '北海道', area: '旭川', kind: '文化', description: 'アイヌ文化、旭山動物園など。', },
  21.         { local: '九州地方', area: '指宿', kind: '保養・自然', description: '指宿温泉、開聞岳、池田湖、長崎鼻。', },
  22.         { local: '九州地方', area: '鹿児島', kind: '歴史遺産・自然', description: '桜島、磯庭園、城山など。', },
  23.         { local: '関東地方', area: '箱根', kind: '保養', description: '箱根温泉、芦ノ湖、箱根駅伝。', },
  24.         { local: '中部地方', area: '黒部', kind: '自然・温泉', description: '宇奈月温泉などの温泉、黒部峡谷。', },
  25.         { local: '中部地方', area: '名古屋', kind: '歴史遺産・文化', description: '名古屋城、熱田神宮、徳川美術館', },
  26.         { local: '四国地方', area: '大洲', kind: '町並・歴史遺産', description: 'おはなはん通り、大洲城、鵜飼など。', },
  27.         { local: '中国地方', area: '米子', kind: '保養・歴史遺産', description: '皆生温泉、米子城跡と城下町', },
  28.         { local: '中国地方', area: '出雲市', kind: '自然・歴史遺産', description: '出雲大社、日御碕、立久恵峡など。', },
  29.         { local: '沖縄地方', area: '南城市知念地区', kind: '歴史遺産', description: '世界遺産である斎場御嶽。', },
  30.       ]);
  31.       // 地方でソート
  32.       self.sortLocal = function()
  33.       {
  34.         self.tourism.sort(function(a,b){return arySort(a.local, b.local, false);});
  35.       };
  36.       // 地方でソート:逆順
  37.       self.sortLocalReverse = function()
  38.       {
  39.         self.tourism.sort(function(a,b){return arySort(a.local, b.local, true);});
  40.       };
  41.       
  42.       // 地域でソート
  43.       self.sortArea = function()
  44.       {
  45.         self.tourism.sort(function(a,b){return arySort(a.area, b.area, false);});
  46.       };
  47.       // 地域でソート:逆順
  48.       self.sortAreaReverse = function()
  49.       {
  50.         self.tourism.sort(function(a,b){return arySort(a.area, b.area, true);});
  51.       };
  52.       
  53.       // 種別でソート
  54.       self.sortKind = function()
  55.       {
  56.         self.tourism.sort(function(a,b){return arySort(a.kind, b.kind, false);});
  57.       };
  58.       // 種別でソート:逆順
  59.       self.sortKindReverse = function()
  60.       {
  61.         self.tourism.sort(function(a,b){return arySort(a.kind, b.kind, true);});
  62.       };
  63.       
  64.       // 説明でソート
  65.       self.sortDescription = function()
  66.       {
  67.         self.tourism.sort(function(a,b){return arySort(a.description, b.description, false);});
  68.       };
  69.       // 説明でソート:逆順
  70.       self.sortDescriptionReverse = function()
  71.       {
  72.         self.tourism.sort(function(a,b){return arySort(a.description, b.description, true);});
  73.       };
  74.     }
  75.     // 連想配列のソート
  76.     function arySort(aKey, bKey, order)
  77.     {
  78.       if ((aKey < bKey && order == true) || (bKey < aKey && order == false))
  79.       {
  80.         return -1;
  81.       }
  82.       else if ((bKey < aKey && order == true) || (aKey < bKey && order == false))
  83.       {
  84.         return 1;
  85.       }
  86.       else
  87.       {
  88.         return 0;
  89.       }
  90.     }
  91.     ko.applyBindings(new viewModel());
  92.   });
  93. </script>
  94. <style type="text/css">
  95. tr:hover{
  96.   background-color:#ffffcc;
  97. }
  98. th, td{
  99.   border:1px solid #ccc;
  100.   font-size:small;
  101. }
  102. </style>
  103. </head>
  104. <body>
  105. <h1>クリックしたカラムでソート2</h1>
  106. <table>
  107. <thead>
  108. <tr>
  109. <th>地方
  110.   <a href="#" data-bind="text: '▼', click: $root.sortLocal"></a>
  111.   <a href="#" data-bind="text: '▲', click: $root.sortLocalReverse"></a>
  112. </th>
  113. <th>地域
  114.   <a href="#" data-bind="text: '▼', click: $root.sortArea"></a>
  115.   <a href="#" data-bind="text: '▲', click: $root.sortAreaReverse"></a>
  116. </th>
  117. <th>種別
  118.   <a href="#" data-bind="text: '▼', click: $root.sortKind"></a>
  119.   <a href="#" data-bind="text: '▲', click: $root.sortKindReverse"></a>
  120. </th>
  121. <th>説明
  122.   <a href="#" data-bind="text: '▼', click: $root.sortDescription"></a>
  123.   <a href="#" data-bind="text: '▲', click: $root.sortDescriptionReverse"></a>
  124. </th>
  125. </tr>
  126. </thead>
  127. <tbody data-bind="foreach: tourism">
  128. <tr>
  129. <td style="white-space:nowrap" data-bind="text: local"></td>
  130. <td style="white-space:nowrap" data-bind="text: area"></td>
  131. <td style="white-space:nowrap" data-bind="text: kind"></td>
  132. <td data-bind="text: description"></td>
  133. </tr>
  134. </tbody>
  135. </table>
  136. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  137. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  138. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  139. </div>
  140. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  141. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  142. </div>
  143. </body>
  144. </html>