カレンダーでクリックされた年月日を取得・表示

  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. <script type="text/javascript">
  9.   /**
  10.    * 年月日に指定された数値を足して返す
  11.    * ymdDate:日付データ
  12.    * 追加する項目:年月日のどれか(ymd)
  13.    * 追加する数値
  14.    */
  15.   function addDate(ymdDate, target, add)
  16.   {
  17.     addNum = parseFloat(add);
  18.     
  19.     yea = ymdDate.getFullYear();
  20.     mon = ymdDate.getMonth();
  21.     day = ymdDate.getDate();
  22.     
  23.     if(target == "y")
  24.     {
  25.       yea += addNum;
  26.     }
  27.     else if(target == "m")
  28.     {
  29.       mon += addNum;
  30.     }
  31.     else if(target == "d")
  32.     {
  33.       day += addNum;
  34.     }
  35.     temp = new Date(yea, mon, day);
  36.     return new Date(yea, mon, day);
  37.   }
  38.   /**
  39.    * カレンダー用に日曜から1日、月末から土曜までを何かで埋め、配列にして返す
  40.    * year    表示するカレンダーの年
  41.    * month  表示するカレンダーの月
  42.    * Fill    日曜から1日まで、月末から土曜まで埋める文字
  43.    */
  44.   function convertDayOfCalendar(year, month, Fill)
  45.   {
  46.     // 月初と月末
  47.     var startMonth = new Date(year + "/" + month + "/1");
  48.     var endMonth   = addDate(new Date(year, month, 1), "d", -1);
  49.     
  50.     // カレンダー用に日にちを配列化:
  51.     DayArray = new Array();
  52.     
  53.     // 日曜~1日の空白を埋める。
  54.     for (i=0; i<startMonth.getDay(); i++)
  55.     {
  56.       DayArray.push(Fill);
  57.     }
  58.     
  59.     // 月初め(1日)~月末までを埋める
  60.     for (i=0; i<endMonth.getDate(); i++)
  61.     {
  62.       DayArray.push(i+1);
  63.     }
  64.     
  65.     // 月末~土曜の空白を埋める
  66.     if (endMonth.getDay() != 6)
  67.     {
  68.       startWeek = parseFloat(endMonth.getDay()) + 1;
  69.       for (i=startWeek; i<7; i++)
  70.       {
  71.         DayArray.push(Fill);
  72.       }
  73.     }
  74.     return DayArray;
  75.   }
  76.   // ▼ knockout.js ===========================================================
  77.   $(document).ready(function () {
  78.     ko.applyBindings(new ViewModel());
  79.   });
  80.   function ViewModel() {
  81.     var self = this;
  82.     self.year = ko.observable(2012);
  83.     self.mont = ko.observable(6);
  84.     date = convertDayOfCalendar(self.year(), self.mont(), "-");
  85.     self.dateData = ko.observableArray(date);
  86.     self.numVal = ko.observable();
  87.     self.when = ko.computed( function()
  88.     {
  89.       return self.year() + "/" + self.mont();
  90.     }, this);
  91.     
  92.     self.nextClick = function()
  93.     {
  94.       // 来月
  95.       nextDate = addDate(new Date(self.year(), self.mont()-1, 1), "m", 1)
  96.       self.year(nextDate.getFullYear());
  97.       self.mont(nextDate.getMonth()+1);
  98.       
  99.       // 来月データの日にち一覧
  100.       date = convertDayOfCalendar(self.year(), self.mont(), "-");
  101.       self.dateData(date);
  102.     }
  103.     self.prefClick = function()
  104.     {
  105.       // 前月
  106.       prefDate = addDate(new Date(self.year(), self.mont()-1, 1), "m", -1)
  107.       self.year(prefDate.getFullYear());
  108.       self.mont(prefDate.getMonth()+1);
  109.       
  110.       // 前月データの日にち一覧
  111.       date = convertDayOfCalendar(self.year(), self.mont(), "-");
  112.       self.dateData(date);
  113.     }
  114.     self.viewNum = function(e)
  115.     {
  116.       viewData = "";
  117.       if (e.toString().match(/^[0-9]+$/) != null)
  118.       {
  119.         viewData = self.year() + "/" + self.mont() + "/" + e;
  120.       }
  121.       self.numVal(viewData);
  122.     }
  123.     
  124.   }
  125. </script>
  126. <style type="text/css">
  127. td
  128. {
  129.   border:1px solid #ccc;
  130. }
  131. td:hover
  132. {
  133.   background:#ffddff;
  134.   cursor:pointer;
  135. }
  136. </style>
  137. </head>
  138. <body>
  139. <h1>カレンダーでクリックされた年月日を取得・表示</h1>
  140. <h2 data-bind="text: when"></h2>
  141. <table>
  142. <thead><tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr></thead>
  143. <tr>
  144. <td data-bind="text: dateData()[0], click: function(){$root.viewNum(dateData()[0]);}"></td>
  145. <td data-bind="text: dateData()[1], click: function(){$root.viewNum(dateData()[1]);}"></td>
  146. <td data-bind="text: dateData()[2], click: function(){$root.viewNum(dateData()[2]);}"></td>
  147. <td data-bind="text: dateData()[3], click: function(){$root.viewNum(dateData()[3]);}"></td>
  148. <td data-bind="text: dateData()[4], click: function(){$root.viewNum(dateData()[4]);}"></td>
  149. <td data-bind="text: dateData()[5], click: function(){$root.viewNum(dateData()[5]);}"></td>
  150. <td data-bind="text: dateData()[6], click: function(){$root.viewNum(dateData()[6]);}"></td>
  151. </tr>
  152. <tr>
  153. <td data-bind="text: dateData()[7], click: function(){$root.viewNum(dateData()[7]);}"></td>
  154. <td data-bind="text: dateData()[8], click: function(){$root.viewNum(dateData()[8]);}"></td>
  155. <td data-bind="text: dateData()[9], click: function(){$root.viewNum(dateData()[9]);}"></td>
  156. <td data-bind="text: dateData()[10], click: function(){$root.viewNum(dateData()[10]);}"></td>
  157. <td data-bind="text: dateData()[11], click: function(){$root.viewNum(dateData()[11]);}"></td>
  158. <td data-bind="text: dateData()[12], click: function(){$root.viewNum(dateData()[12]);}"></td>
  159. <td data-bind="text: dateData()[13], click: function(){$root.viewNum(dateData()[13]);}"></td>
  160. </tr>
  161. <tr>
  162. <td data-bind="text: dateData()[14], click: function(){$root.viewNum(dateData()[14]);}"></td>
  163. <td data-bind="text: dateData()[15], click: function(){$root.viewNum(dateData()[15]);}"></td>
  164. <td data-bind="text: dateData()[16], click: function(){$root.viewNum(dateData()[16]);}"></td>
  165. <td data-bind="text: dateData()[17], click: function(){$root.viewNum(dateData()[17]);}"></td>
  166. <td data-bind="text: dateData()[18], click: function(){$root.viewNum(dateData()[18]);}"></td>
  167. <td data-bind="text: dateData()[19], click: function(){$root.viewNum(dateData()[19]);}"></td>
  168. <td data-bind="text: dateData()[20], click: function(){$root.viewNum(dateData()[20]);}"></td>
  169. </tr>
  170. <tr>
  171. <td data-bind="text: dateData()[21], click: function(){$root.viewNum(dateData()[21]);}"></td>
  172. <td data-bind="text: dateData()[22], click: function(){$root.viewNum(dateData()[22]);}"></td>
  173. <td data-bind="text: dateData()[23], click: function(){$root.viewNum(dateData()[23]);}"></td>
  174. <td data-bind="text: dateData()[24], click: function(){$root.viewNum(dateData()[24]);}"></td>
  175. <td data-bind="text: dateData()[25], click: function(){$root.viewNum(dateData()[25]);}"></td>
  176. <td data-bind="text: dateData()[26], click: function(){$root.viewNum(dateData()[26]);}"></td>
  177. <td data-bind="text: dateData()[27], click: function(){$root.viewNum(dateData()[27]);}"></td>
  178. </tr>
  179. <tr data-bind="if: 28<dateData().length">
  180. <td data-bind="text: dateData()[28], click: function(){$root.viewNum(dateData()[28]);}"></td>
  181. <td data-bind="text: dateData()[29], click: function(){$root.viewNum(dateData()[29]);}"></td>
  182. <td data-bind="text: dateData()[30], click: function(){$root.viewNum(dateData()[30]);}"></td>
  183. <td data-bind="text: dateData()[31], click: function(){$root.viewNum(dateData()[31]);}"></td>
  184. <td data-bind="text: dateData()[32], click: function(){$root.viewNum(dateData()[32]);}"></td>
  185. <td data-bind="text: dateData()[33], click: function(){$root.viewNum(dateData()[33]);}"></td>
  186. <td data-bind="text: dateData()[34], click: function(){$root.viewNum(dateData()[34]);}"></td>
  187. </tr>
  188. </table>
  189. <button data-bind="click: prefClick">前月</button>
  190. <button data-bind="click: nextClick">来月</button>
  191. <br />
  192. <p>クリックされた日にち<br /><input type="text" data-bind="value: numVal"></p>
  193. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  194. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  195. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  196. </div>
  197. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  198. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  199. </div>
  200. </body>
  201. </html>