Skip to content

Instantly share code, notes, and snippets.

@kijtra
Created October 4, 2011 01:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kijtra/1260683 to your computer and use it in GitHub Desktop.
Save kijtra/1260683 to your computer and use it in GitHub Desktop.
[JavaScript] 「input type="hidden"」に対し、日付の選択プルダウンを表示させる。(要jQuery)
/*
使用方法
$('input[name="date"]').dateSelector({
format:'y-m-d', //日付選択後、hiddenフォームに入る日付の形式。「y」「m」「d」(すべて小文字)がそれぞれ置換されます
date:'today', //初期表示日付。yyyy-mm-ddまたはyyyy/mm/ddまたは「today」もしくは「now」に対応
year:'2000,+2' //年の範囲。「最小年,最大年」の形式で、年そのものか、「+2(年)」「-3(年)」に対応
block:false, //年、月、日のプルダウンがまとまったものをブロック要素(div)にするか、インライン要素(span)にするか
before:false, //hiddenフォームの前に挿入する場合はtrue
onchange:function(y,m,d){} //各プルダウンの選択後(全て値が入っている場合)に実行する関数。年、月、日の数値が渡される
});
*/
;(function(){
jQuery.fn.dateSelector=function(conf){
if(!this.size()){
return false;
}
var dd=new Date();
var nowY=dd.getYear();
nowY+=(nowY<2000) ? 1900 : 0;
var nowM=dd.getMonth()+1;
var nowD=dd.getDate();
conf=$.extend({
date:nowY+'-'+('0'+nowM).slice(-2)+'-'+('0'+nowD).slice(-2),
format:'yy-mm-dd',
year:'-5,+2',
block:false,
before:false,
'class':'',
onchange:function(y,m,d){}
},conf);
var set=function($t,$y,$m,$d){
if(!$y || !$m || !$d){
return false;
}
var y=$y.val();
var m=$m.val();
var d=$d.val();
if(y.match(/^\d{4}$/) && m.match(/^\d{1,2}$/) && d.match(/^\d{1,2}$/)){
var val=conf.format;
val=val.replace('yy',y).replace('mm',('0'+m).slice(-2)).replace('dd',('0'+d).slice(-2));
$t.val(val);
}else{
$t.val('');
}
if(typeof conf.onchange=='function'){
conf.onchange(y,m,d);
}
return null;
};
var years=function(d){
var mn,mx;
var e=conf.year.split(',');
if(e[0].match(/^([\-\+])([0-9]+)/)){
mn=nowY+(RegExp.$1=='-' ? 0-Number(RegExp.$2) : Number(RegExp.$2));
}else if(e[0].match(/^\d{4}$/)){
mn=Number(e[0]);
}else{
mn=nowY-2;
}
if(e[1].match(/^([\-\+])([0-9]+)/)){
mx=nowY+(RegExp.$1=='-' ? 0-Number(RegExp.$2) : Number(RegExp.$2));
}else if(e[1].match(/^\d{4}$/)){
mx=Number(e[1]);
}else{
mx=nowY+2;
}
var ops='<option value="">\u5e74</option>';
for(var i=mn;i<=mx;i++){
s=(d==i) ? 'selected="selected"' : '';
ops+='<option value="'+i+'"'+s+'>'+i+'\u5e74</option>';
if(i==mx){
return $('<select class="dateselector_year '+conf['class']+'" />').html(ops);
}
}
return null;
};
var months=function(d){
var mn=1;
var mx=12;
var ops='<option value="">\u6708</option>';
for(var i=mn;i<=mx;i++){
s=(d==i) ? 'selected="selected"' : '';
ops+='<option value="'+i+'"'+s+'>'+i+'\u6708</option>';
if(i==mx){
return $('<select class="dateselector_month '+conf['class']+'" />').html(ops);
}
}
return null;
};
var days=function(d){
var mn=1;
var mx=31;
var ops='<option value="">\u65e5</option>';
for(var i=mn;i<=mx;i++){
s=(d==i) ? 'selected="selected"' : '';
ops+='<option value="'+i+'"'+s+'>'+i+'\u65e5</option>';
if(i==mx){
return $('<select class="dateselector_day '+conf['class']+'" />').html(ops);
}
}
return null;
};
this.each(function(){
if(!this.tagName.match(/^INPUT$/i)){
return false;
}
var $t=$(this).hide();
var e,yy,mm,dd;
var date=($t.val()) ? $t.val() : conf.date;
if(date && date.match(/^\d{4}-\d{2}-\d{2}$/)){
e=date.split('-');
yy=Number(e[0]);
mm=Number(e[1]);
dd=Number(e[2]);
}else if(date && date.match(/^\d{4}\/\d{2}\/\d{2}$/)){
e=date.split('/');
yy=Number(e[0]);
mm=Number(e[1]);
dd=Number(e[2]);
}else{
if(conf.date=='today' || conf.date=='now'){
yy=nowY;
mm=nowM;
dd=nowD;
}else{
yy='';
mm='';
dd='';
}
}
var $y=years(yy);
var $m=months(mm);
var $d=days(dd);
$y.change(function(){
set($t,$y,$m,$d);
});
$m.change(function(){
set($t,$y,$m,$d);
});
$d.change(function(){
set($t,$y,$m,$d);
});
if(date){
set($t,$y,$m,$d);
}
var obj=$('<'+(conf.block ? 'div' : 'span')+' class="dateselector dateselector_'+$t.attr('name')+'" />').append($y,$m,$d);
if(conf.before){
$t.before(obj);
}else{
$t.after(obj);
}
return true;
});
return this;
};
})(jQuery);
;(function(){jQuery.fn.dateSelector=function(conf){if(!this.size()){return false}var dd=new Date();var nowY=dd.getYear();nowY+=(nowY<2000)?1900:0;var nowM=dd.getMonth()+1;var nowD=dd.getDate();conf=$.extend({date:nowY+'-'+('0'+nowM).slice(-2)+'-'+('0'+nowD).slice(-2),format:'yy-mm-dd',year:'-5,+2',block:false,before:false,'class':'',onchange:function(y,m,d){}},conf);var set=function($t,$y,$m,$d){if(!$y||!$m||!$d){return false}var y=$y.val();var m=$m.val();var d=$d.val();if(y.match(/^\d{4}$/)&&m.match(/^\d{1,2}$/)&&d.match(/^\d{1,2}$/)){var val=conf.format;val=val.replace('yy',y).replace('mm',('0'+m).slice(-2)).replace('dd',('0'+d).slice(-2));$t.val(val)}else{$t.val('')}if(typeof conf.onchange=='function'){conf.onchange(y,m,d)}return null};var years=function(d){var mn,mx;var e=conf.year.split(',');if(e[0].match(/^([\-\+])([0-9]+)/)){mn=nowY+(RegExp.$1=='-'?0-Number(RegExp.$2):Number(RegExp.$2))}else if(e[0].match(/^\d{4}$/)){mn=Number(e[0])}else{mn=nowY-2}if(e[1].match(/^([\-\+])([0-9]+)/)){mx=nowY+(RegExp.$1=='-'?0-Number(RegExp.$2):Number(RegExp.$2))}else if(e[1].match(/^\d{4}$/)){mx=Number(e[1])}else{mx=nowY+2}var ops='<option value="">\u5e74</option>';for(var i=mn;i<=mx;i++){s=(d==i)?'selected="selected"':'';ops+='<option value="'+i+'"'+s+'>'+i+'\u5e74</option>';if(i==mx){return $('<select class="dateselector_year '+conf['class']+'" />').html(ops)}}return null};var months=function(d){var mn=1;var mx=12;var ops='<option value="">\u6708</option>';for(var i=mn;i<=mx;i++){s=(d==i)?'selected="selected"':'';ops+='<option value="'+i+'"'+s+'>'+i+'\u6708</option>';if(i==mx){return $('<select class="dateselector_month '+conf['class']+'" />').html(ops)}}return null};var days=function(d){var mn=1;var mx=31;var ops='<option value="">\u65e5</option>';for(var i=mn;i<=mx;i++){s=(d==i)?'selected="selected"':'';ops+='<option value="'+i+'"'+s+'>'+i+'\u65e5</option>';if(i==mx){return $('<select class="dateselector_day '+conf['class']+'" />').html(ops)}}return null};this.each(function(){if(!this.tagName.match(/^INPUT$/i)){return false}var $t=$(this).hide();var e,yy,mm,dd;var date=($t.val())?$t.val():conf.date;if(date&&date.match(/^\d{4}-\d{2}-\d{2}$/)){e=date.split('-');yy=Number(e[0]);mm=Number(e[1]);dd=Number(e[2])}else if(date&&date.match(/^\d{4}\/\d{2}\/\d{2}$/)){e=date.split('/');yy=Number(e[0]);mm=Number(e[1]);dd=Number(e[2])}else{if(conf.date=='today'||conf.date=='now'){yy=nowY;mm=nowM;dd=nowD}else{yy='';mm='';dd=''}}var $y=years(yy);var $m=months(mm);var $d=days(dd);$y.change(function(){set($t,$y,$m,$d)});$m.change(function(){set($t,$y,$m,$d)});$d.change(function(){set($t,$y,$m,$d)});if(date){set($t,$y,$m,$d)}var obj=$('<'+(conf.block?'div':'span')+' class="dateselector dateselector_'+$t.attr('name')+'" />').append($y,$m,$d);if(conf.before){$t.before(obj)}else{$t.after(obj)}return true});return this}})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment