teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

追記3:スクリプトのミスを修正

2016/04/08 02:17

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -131,7 +131,7 @@
131
131
  if(e.date){
132
132
  var d = e.date;
133
133
  $('#target_year').val( d.getFullYear() );
134
- $('#target_year')val( d.getMonth() + 1 );
134
+ $('#target_year').val( d.getMonth() + 1 );
135
135
  $('#target_year').val( d.getDate());
136
136
  }
137
137
  $(this).datepicker('hide')

4

ソース内のバグを修正:追記3のOption指定部分

2016/04/08 02:17

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  ```
126
126
  $('#container').datepicker({
127
- language : ja,
127
+ language : 'ja',
128
128
  clearBtn : true,
129
129
  container : '#dpbody'
130
130
  }).on('changeDate', function(){

3

質問者コメントに対応

2016/04/08 02:15

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -87,5 +87,56 @@
87
87
  };
88
88
  dpinit($('#container'), $('#target_year'), $('#target_month'), $('#target_day'));
89
89
  });
90
+ ```
90
91
 
92
+ ■追記3
93
+
94
+ **datepickerのオプションについて**
95
+
96
+ ■日本語化
97
+ 「language : "ja"」→有効にするために「bootstrap-datepicker.ja.js」または「bootstrap-datepicker.ja.min.js」を読み込んどく必要があります。
98
+
99
+ ■クリアボタン
100
+ 「clearBtn:true」→クリアボタンを押すと「changeDate」イベントも発生するため、選択された日付データを取得するところでnull対策をしないといけないです。
101
+
102
+ ■選択したらすぐ消滅
103
+ 「autoclose:true」→私のやり方だと設定の必要がありません。勝手に「hide」メソッド呼んでるので。
104
+
105
+ ■表示が左上になる
106
+ 「container:表示位置の基準要素」→どちらかというとstylesheetの設定の問題。
107
+
108
+
109
+ で、html部を再掲
110
+
111
+
91
- ```
112
+ ```
113
+ <input type="text" id="target_year" name="target_year" size="4" maxlength="4" class="inp" value="" />年
114
+ <input type="text" id="target_month" name="target_month" size="2" maxlength="2" class="inp" value="" />月
115
+ <input type="text" id="target_day" name="target_day" size="2" maxlength="2" class="inp" value="" />日
116
+ <input type="button" id="dp_pos1" name="dp_pos1" value="日付選択" />
117
+ <input type='hidden' id='container' />
118
+ </tbody>
119
+ </table>
120
+ <div id='dpbody' style='position:absolute;left:200px'></div>
121
+ ```
122
+
123
+ 次にjavascript(一部)
124
+
125
+ ```
126
+ $('#container').datepicker({
127
+ language : ja,
128
+ clearBtn : true,
129
+ container : '#dpbody'
130
+ }).on('changeDate', function(){
131
+ if(e.date){
132
+ var d = e.date;
133
+ $('#target_year').val( d.getFullYear() );
134
+ $('#target_year')val( d.getMonth() + 1 );
135
+ $('#target_year').val( d.getDate());
136
+ }
137
+ $(this).datepicker('hide')
138
+ });
139
+ $('#dp_pos1').on('click', function(){ $('#container').datepicker('show'); });
140
+ ```
141
+
142
+ 。。。さあ、これでどや。

2

全体像を追加

2016/04/07 09:10

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -51,4 +51,41 @@
51
51
  };
52
52
  r($('#container'));
53
53
 
54
+ ```
55
+
56
+ ■追記2:
57
+ 最終的にこれくらいにしとけば変更に耐えやすいかな。
58
+ ```
59
+ $(function(){
60
+
61
+ var dpinit = function(dp, year, mon, day, d){
62
+
63
+ var _get = function(elm){ return elm.datepicker('getDate'); }
64
+ var _set = function(elm, val){ elm.datepicker('setDate', val); return elm; }
65
+
66
+ dp.datepicker().on('changeDate', function(e) {
67
+ year.val( (d =e.date).getFullYear() );
68
+ mon.val( d.getMonth() + 1 );
69
+ day.val( d.getDate());
70
+ $(this).datepicker('hide')
71
+ });
72
+
73
+ $('#dp_pos1').on('click', function(){ dp.datepicker('show'); });
74
+
75
+ year.on('change', function(){
76
+ (d =_get(dp)).setFullYear($(this).val());
77
+ _set(dp, d);
78
+ });
79
+ mon.on('change', function(){
80
+ (d =_get(dp)).setMonth($(this).val() - 1);
81
+ _set(dp, d);
82
+ });
83
+ day.on('change', function(){
84
+ (d =_get(dp)).setDate($(this).val());
85
+ _set(dp, d);
86
+ });
87
+ };
88
+ dpinit($('#container'), $('#target_year'), $('#target_month'), $('#target_day'));
89
+ });
90
+
54
91
  ```

1

datepicker<=>inputタグの相互値連動処理を追加。

2016/04/07 07:55

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -25,4 +25,30 @@
25
25
  要するにボタンはボタンの役割だけ(押されたらdatepicker呼び出し[show])
26
26
  DatePicker側はchangeイベントの最後に自分を消す(hide)という。
27
27
 
28
- もともと入力欄とセットで使うのが目的のものなので今回の質問者さんの使用法はおそらく想定外のものだったのではないかと。
28
+ もともと入力欄とセットで使うのが目的のものなので今回の質問者さんの使用法はおそらく想定外のものだったのではないかと。
29
+
30
+
31
+ ■追記:
32
+ datepicker→各inputタグの値渡しはできてるけどその逆がないので追加。
33
+
34
+ ```
35
+ var r = function(dp){
36
+ $('#target_year').on('change', function(){
37
+ var d =dp.datepicker('getDate');
38
+ d.setFullYear($(this).val());
39
+ dp.datepicker('setDate', d);
40
+ });
41
+ $('#target_month').on('change', function(){
42
+ var d = dp.datepicker('getDate');
43
+ d.setMonth($(this).val() - 1);
44
+ dp.datepicker('setDate', d);
45
+ });
46
+ $('#target_day').on('change', function(){
47
+ var d = dp.datepicker('getDate');
48
+ d.setDate($(this).val());
49
+ dp.datepicker('setDate', d);
50
+ });
51
+ };
52
+ r($('#container'));
53
+
54
+ ```