日時の入力欄を、後の処理はしやすいままで、入力しやすくする(datetimepickerっぽいもの)
問題
以下のような、日付と時間を入力するタイプの日時入力欄が入力しにくい。
YYYY-MM-DD hh:mm:ss形式で入力してもらえると楽なのはプログラマの都合。ユーザーには優しくない。
下図のような入力欄にしたい。
しかし、プログラム上は「日時」で管理されている項目なので、画面上は「日+時」になると、「日時」を分割したり、「日+時」を結合したりが面倒だ。
表面上はユーザーに優しいインターフェース、内部的にはプログラマに優しい処理をおこないたい。
答え
日時の入力欄を、後の処理はしやすいままで、入力しやすくするjQueryプラグインを作ってみる。
HTMLは以下のようにするだけ。
HTML
<input type="text" class="datetimepicker" name="entry_datetime" value="2012-11-01 12:30:00">
JavaScriptで、表面上は jqueryuiのDatepicker + 時刻プルダウンに変形する。
JavaScript
$(function(){ $('.datetimepicker').each(function(){ //日時はhiddenに切り替え。見た目は日付と時間入力に変更。 var $dt = $('<input type="hidden">').attr('name', this.name).val(this.value); //見た目を調整するためのclassがあれば指定 var $d = $('<input type="text">').addClass('calendar'); var $t = $('<select></select>').addClass('input-small'); $(this).after($dt, $d, ' ', $t); //日付の方はdatepickerにする $d.datepicker({dateFormat: 'yy-mm-dd','など、オプションを適当に':'指定してください'}); //時刻の方は10分おきのプルダウンなどにする var hh = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']; var mm = ['00', '10', '20', '30', '40', '50']; for (var i = 0; i < hh.length; ++i) { for (var j = 0; j < mm.length; ++j) { var $o = $('<option></option>') .attr('value', hh[i] + ':' + mm[j] + ':00') .text(hh[i] + ':' + mm[j]); $t.append($o); } } //初期値があれば反映 $d.val(this.value.replace(/^(\d\d\d\d-\d\d-\d\d).*$/, "$1")); $t.val(this.value.replace(/^.*(\d\d:\d\d:\d\d).*$/, "$1")); //日付変更時と時間変更時にhidden化した方へ値を反映する処理を仕込んでおく function x(){$dt.val($d.val() + ' ' + $t.val());} $d.datepicker('option', 'onSelect', x); $d.on('change', x); $t.on('change', x); //オリジナルはさようなら $(this).remove(); }); });
こんなふうになります。
図解
Demo
フォームから送信される値は、type=”hidden”にして見えなくした要素にJavaScriptで入れている日付と時刻を結合したものになる。サーバー側での後の処理が楽。
日付形式が必ずYYYY-MM-DD hh:mm:ss形式で、プルダウンは10分おきで秒は指定しないといった前提条件の下で作ってあるので、状況に応じてカスタマイズすること。
コメント