1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
|
---
title: <input type="month">
slug: Web/HTML/Element/input/month
tags:
- Date picker
- Element
- Form input
- Forms
- HTML
- HTML forms
- HTML input
- Input
- Input Element
- Input Type
- Number
- Reference
- month
translation_of: Web/HTML/Element/input/month
---
<div>{{HTMLRef("Input_types")}}</div>
<p><span class="seoSummary">{{HTMLElement("input")}} 要素の <strong><code>month</code></strong> 型は、ユーザーが年と月を入力できるようにする入力フィールドを作成し、年と月を簡単に入力できるようにします。値は "<code>YYYY-MM</code>" の形式の文字列で、 <code>YYYY</code> は4桁の年、 <code>MM</code> は月の番号です。</span></p>
<div>{{EmbedInteractiveExample("pages/tabbed/input-month.html", "tabbed-shorter")}}</div>
<div class="hidden">このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> をクローンしてプルリクエストを送信してください。</div>
<p>コントロールのユーザーインターフェイスは、一般にブラウザーによって異なります。現時点では対応が不安定であり、デスクトップ版の Chrome/Opera と Edge — および最新のバージョンのモバイルブラウザー — のみに利用可能な実装があります。 <code>month</code> 入力欄に対応していないブラウザーでは、コントロールは単純な <code><a href="/ja/docs/Web/HTML/Element/input/text"><input type="text"></a></code> に格下げされますが、入力されたテキストが期待されている形式であることを保証するための自動検証が行われることもあります。</p>
<p><code>month</code> に対応していないブラウザーを使用している場合のために、このスクリーンショットで Chrome と Opera でどのように見えるかを示します。右端にある下向き矢印をクリックすると、年と月を選択できる日付選択が表示されます。</p>
<p><img alt="" src="https://mdn.mozillademos.org/files/15391/month-control-chrome.png" style="display: block; height: 216px; margin: 0px auto; width: 273px;"></p>
<p>Microsoft Edge では、 <code>month</code> コントロールはこのように表示されます。</p>
<p><img alt="" src="https://mdn.mozillademos.org/files/15393/month-control-edge.png" style="display: block; height: 389px; margin: 0px auto; width: 227px;"></p>
<table class="properties">
<tbody>
<tr>
<td><strong>{{anch("Value", "値")}}</strong></td>
<td>年と月を表す {{domxref("DOMString")}}、または空欄</td>
</tr>
<tr>
<td><strong>イベント</strong></td>
<td>{{domxref("HTMLElement/change_event", "change")}} および {{domxref("HTMLElement/input_event", "input")}}</td>
</tr>
<tr>
<td><strong>対応している共通属性</strong></td>
<td>{{htmlattrxref("autocomplete", "input")}}, {{htmlattrxref("list", "input")}}, {{htmlattrxref("readonly", "input")}}, {{htmlattrxref("step", "input")}}</td>
</tr>
<tr>
<td><strong>IDL 属性</strong></td>
<td><code>value</code></td>
</tr>
<tr>
<td><strong>メソッド</strong></td>
<td>{{domxref("HTMLInputElement.select", "select()")}}, {{domxref("HTMLInputElement.stepDown", "stepDown()")}}, {{domxref("HTMLInputElement.stepUp", "stepUp()")}}</td>
</tr>
</tbody>
</table>
<h2 id="Value" name="Value">値</h2>
<p>{{domxref("DOMString")}} で、入力欄に入力された年と月の値を YYYY-MM (4桁以上の年に続いてハイフン ("<code>-</code>")、続いて2桁の月) の形式で表します。この入力型で使用される時刻の値の形式について詳しくは、 <a href="/ja/docs/Web/HTML/Date_and_time_formats">HTML で使われる日付や時刻の形式</a>の<a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">月の文字列をご覧ください。</a></p>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">入力コントロールの既定値は、次のように {{htmlattrxref("value", "input")}} 属性に年と月を入れることで設定することができます。</a></p>
<div id="value-example-1">
<pre class="brush: html notranslate"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><label for="bday-month">生まれた月は?</label>
<input id="bday-month" type="month" name="bday-month" value="2017-06"></a></pre>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">{{EmbedLiveSample('value-example-1', 600, 60)}}</a></p>
</div>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">一点気を付けなければならないことは、表示される日付の書式は実際の <code>value</code> とは異なるということです。多くの{{Glossary("user agent", "ユーザーエージェント")}}は、年と月をユーザーのオペレーティングシステムに設定されたロケールに適した形式で表示しますが、日付の <code>value</code> は常に <code>yyyy-MM</code> の書式です。</a></p>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">When the above value is submitted to the server, for example, it will look like <code>bday-month=1978-06</code>.</a></p>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">次のように、 JavaScript で {{domxref("HTMLInputElement.value", "value")}} プロパティを使用して、日付の値を取得したり設定したりすることもできます。</a></p>
<div id="value-example-2">
<div class="hidden">
<pre class="brush: html notranslate"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><label for="bday-month">生まれた月は?</label>
<input id="bday-month" type="month" name="bday-month" value="2017-06"></a></pre>
</div>
<pre class="brush: js notranslate"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">var monthControl = document.querySelector('input[type="month"]');
monthControl.value = '1978-06';</a></pre>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">{{EmbedLiveSample("value-example-2", 600, 60)}}</a></p>
</div>
<h2 id="Additional_attributes" name="Additional_attributes"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">追加の属性</a></h2>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">すべての {{HTMLElement("input")}} 型で共通する属性に加え、 <code>month</code> 型の入力欄は次の属性にも対応しています。</a></p>
<table class="standard-table">
<thead>
<tr>
<th scope="col"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">属性</a></th>
<th scope="col"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">説明</a></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><code>{{anch("list")}}</code></a></td>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">オプションで自動補完の定義済みの選択肢を含む <datalist> 要素の id</a></td>
</tr>
<tr>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><code>{{anch("max")}}</code></a></td>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">受け付ける最新の年月</a></td>
</tr>
<tr>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><code>{{anch("min")}}</code></a></td>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">受け付ける最古の年月</a></td>
</tr>
<tr>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><code>{{anch("readonly")}}</code></a></td>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">論理属性で、存在すれば、入力欄の値が編集できないことを示す</a></td>
</tr>
<tr>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings"><code>{{anch("step")}}</code></a></td>
<td><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">上下の矢印で値を調整する時や、検証に使用する刻み値</a></td>
</tr>
</tbody>
</table>
<p id="htmlattrdeflist"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">{{page("/ja/docs/Web/HTML/Element/input/text", "list", 0, 1, 2)}}</a></p>
<h3 id="htmlattrdefmax"><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">{{htmlattrdef("max")}}</a></h3>
<p><a href="/ja/docs/Web/HTML/Date_and_time_formats#Month_strings">最新の年月で、上記の{{anch("Value", "値")}}で説明した文字列の書式です。要素に入力された {{htmlattrxref("value", "input")}} がこの日付よりも後の場合、要素は</a><a href="/ja/docs/Web/Guide/HTML/HTML5/Constraint_validation">制約検証</a>に失敗します。 <code>max</code> 属性の値が "<code>yyyy-MM</code>" の書式に従う妥当な文字列でない場合、要素は最大値を持ちません。</p>
<p>この値は <code>min</code> 属性で指定されたものより後か、同じ年月を指定する必要があります。</p>
<h3 id="htmlattrdefmin">{{htmlattrdef("min")}}</h3>
<p>受け付ける最古の年月で、前述と同じ <code>yyyy-MM</code> の書式です。要素の {{htmlattrxref("value", "input")}} がこれより前の場合、要素は<a href="/ja/docs/Web/Guide/HTML/HTML5/Constraint_validation">制約検証</a>に失敗します。 <code>min</code> 属性の値が "<code>yyyy-MM-dd</code>" の書式に従う妥当な文字列でない場合、要素は最小値を持ちません。</p>
<p>この値は <code>max</code> 属性で指定されたものより前か、同じ年月を指定する必要があります。</p>
<h3 id="htmlattrdefreadonly">{{htmlattrdef("readonly")}}</h3>
<p>論理属性で、存在すれば、ユーザーが編集することができないことを表します。しかし、 <code>value</code> は、 JavaScript コードから直接 {{domxref("HTMLInputElement.value")}} プロパティを設定することで変更することができます。</p>
<div class="note">
<p><strong>注:</strong> 読み取り専用フィールドは値を持てないため、 <code>required</code> は <code>readonly</code> 属性も指定されている入力欄には効果がありません。</p>
</div>
<h3 id="htmlattrdefstep">{{htmlattrdef("step")}}</h3>
<p>{{page("/ja/docs/Web/HTML/Element/input/number", "step-include")}}</p>
<p><code>date</code> 入力欄では、 <code>step</code> の値は月数で指定され、倍率は1です (数値も月単位であるため)。 <code>step</code> の既定値は 1 です。</p>
<h2 id="Using_month_inputs" name="Using_month_inputs">month 入力欄の使用</h2>
<p>日付に関する入力欄は (<code>month</code> を含め) 一見すると便利に見えます。日付の選択に簡単なユーザーインターフェイスを提供し、サーバーに送信するデータの書式をユーザーのロケールに関係なく正規化してくれます。しかし、現時点ではブラウザーの対応が限定されているため、 <code><input type="month"></code> には問題があります。</p>
<p><code><input type="month"></code> の基本的な使い方と少し複雑な使い方を見てみてから、その後でブラウザーの互換性の問題を緩和するアドバイスを提供しましょう ({{anch("Handling browser support", "ブラウザーの互換性の扱い")}} を参照してください)。</p>
<h3 id="Basic_uses_of_month" name="Basic_uses_of_month">月入力の基本的な使用</h3>
<p>もっとも単純な <code><input type="month"></code> の使用方法は、次のように基本的な {{HTMLElement("input")}} と {{htmlelement("label")}} 要素の組み合わせです。</p>
<pre class="brush: html notranslate"><form>
<label for="bday-month">生まれた月を入力してください。</label>
<input id="bday-month" type="month" name="bday-month">
</form></pre>
<p>{{EmbedLiveSample('Basic_uses_of_month', 600, 40)}}</p>
<h3 id="Setting_maximum_and_minimum_dates" name="Setting_maximum_and_minimum_dates">日付の最大値と最小値の設定</h3>
<p>{{htmlattrxref("min", "input")}} および {{htmlattrxref("max", "input")}} 属性を使用して、ユーザーが選択できる日付の範囲を制限することができます。次の例では、日付の最小値を <code>1900-01</code> に、日付の最大値を <code>1999-12</code> に指定しています。</p>
<pre class="brush: html notranslate"><form>
<label for="bday-month">生まれた月を入力してください。</label>
<input id="bday-month" type="month" name="bday-month"
min="1900-01" max="1999-12">
</form></pre>
<p>{{EmbedLiveSample('Setting_maximum_and_minimum_dates', 600, 40)}}</p>
<p>次のような結果になります。</p>
<ul>
<li>1900年1月から1999年12月までの間の月のみが選択できます。この範囲から外れた月は、コントロール内でスクロールできません。</li>
<li>使用しているブラウザーによりますが、指定された範囲外の月が月選択で選択できないか (Edge など)、無効になるものの ({{anch("Validation", "検証")}} を参照) 選択できるか (Chrome など) だということが分かるでしょう。</li>
</ul>
<h3 id="Controlling_input_size" name="Controlling_input_size">入力欄の寸法の制御</h3>
<p><code><input type="month"></code> は {{htmlattrxref("size", "input")}} のような寸法に関する属性には対応していません。寸法を変更する必要がある場合は、 <a href="/ja/docs/Web/CSS">CSS</a> を使用する必要があります。</p>
<h2 id="Validation" name="Validation">検証</h2>
<p>既定で、 <code><input type="month"></code> は入力された値の検証を行いません。ユーザーインターフェイスの実装は一般的に、日付でないものの入力をさせないからです。これは便利です。しかし、それでも <code>month</code> 入力欄を空のまま、または無効な日付 (例えば4月32日など) を入力してフォームを送信することが可能です。</p>
<p>これを防ぐために、 {{htmlattrxref("min", "input")}} と {{htmlattrxref("max", "input")}} を用いて利用可能な日を制限することができ ({{anch("Setting maximum and minimum dates", "日付の最大値と最小値の設定")}} を参照)、加えて {{htmlattrxref("required", "input")}} 属性を用いて、日付を入力することを必須にすることができます。結果として、対応しているブラウザーは、範囲外の日付や空の日付フィールドを送信しようとするとエラーを表示します。</p>
<p>例を見てみましょう。ここで日付の最小値と最大値を設定し、入力欄を必須にしました。</p>
<pre class="brush: html notranslate"><form>
<div>
<label for="month">何月にいらっしゃいますか? (夏期間のみ、 yyyy-mm)</label>
<input id="month" type="month" name="month"
min="2017-06" max="2017-09" required>
<span class="validity"></span>
</div>
<div>
<input type="submit" value="フォームを送信">
</div>
</form></pre>
<p>年と月を指定せずに (または設定した範囲を外れた日付を) 送信しようとすると、ブラウザーはエラーを表示します。例を実行してみましょう。</p>
<p>{{EmbedLiveSample('Validation', 600, 120)}}</p>
<p>対応しているブラウザーで入力しなかった場合のスクリーンショットです。</p>
<p><img alt="" src="https://mdn.mozillademos.org/files/15395/month-required.png" style="display: block; margin: 0 auto;"></p>
<p>上記の例の CSS です。 CSS の {{cssxref(":valid")}} および {{cssxref(":invalid")}} プロパティを使用して、現在の値が有効かどうかに基づいてスタイルを設定しています。アイコンは入力欄そのものではなく、入力欄の隣の {{htmlelement("span")}} に置くようにしないと、 Chrome ではコントロールの内側にコンテンツを生成するので、正しく整形したり表示したりすることができません。</p>
<pre class="brush: css notranslate">div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid+span:after {
position: absolute;
content: '✖';
padding-left: 5px;
}
input:valid+span:after {
position: absolute;
content: '✓';
padding-left: 5px;
}</pre>
<div class="warning">
<p><strong>重要</strong>: HTML のフォーム検証は、入力されたデータが正しい形式であることを保証するスクリプトの代用にはなりません。 HTML を調整して検証をくぐり抜けたり、完全に削除したりすることはとても簡単にできます。 HTML を完全にバイパスし、サーバーに直接データを送信することも可能です。サーバー側のコードが受信したデータの検証に失敗した場合、不適切な形式のデータ (または大きすぎるデータ、誤った種類のデータなど) が送信された場合に障害が発生するおそれがあります。</p>
</div>
<h2 id="Handling_browser_support" name="Handling_browser_support">ブラウザーの対応の扱い</h2>
<p>前述のように、現時点で日付入力を書く上で一番の問題は、多くの主要なブラウザーがまだすべてを実装している訳ではないということです。デスクトップでは Chrome/Opera と Edge のみが対応しており、モバイルでは多くの最新のブラウザーが対応しています。例えば、 <code>month</code> の選択画面は Android 版 Chrome ではこのように表示されます。</p>
<p><img alt="" src="https://mdn.mozillademos.org/files/15397/month-android.png" style="display: block; margin: 0 auto;"></p>
<p>対応していないブラウザーでは、文字列入力欄に安全に格下げされますが、これはユーザーインターフェイスの一貫性 (表示されるコントロールが異なること) とデータの扱いの両方で問題を生みます。</p>
<p>2番目の問題はより深刻です。すでに述べたように、 <code>month</code> 入力欄では、実際の値が常に <code>yyyy-mm</code> の書式で正規化されます。一方、既定の設定では、 <code>text</code> 入力欄ではどの書式で入力されるかの認識がなく、以下のように人間が日付を書く様々な方法で入力される可能性があります。</p>
<ul>
<li><code>yyyy/mm</code> (2018/07)</li>
<li><code>yyyymm</code> (201807)</li>
<li><code>mm-yyyy</code> (07-2018)</li>
<li><code>yyyy-mm</code> (2018-07)</li>
<li><code>Month yyyy</code> (July 2018)</li>
<li>... などなど。</li>
</ul>
<p>これを回避する方法の一つは、 <code>month</code> 入力欄に {{htmlattrxref("pattern", "input")}} 属性を付けることです。 <code>month</code> 入力欄はこれを使用しないので、 <code>text</code> 入力欄などとして扱うようフォールバックされたときに、このパターンを使用します。例えば、次の例を <code>month</code> 入力欄に未対応のブラウザーで見てみてください。</p>
<pre class="brush: html notranslate"><form>
<div>
<label for="month">何月にいらっしゃいますか? (夏期間のみ、 yyyy-mm)</label>
<input id="month" type="month" name="month"
min="2017-06" max="2017-09" required
pattern="[0-9]{4}-[0-9]{2}">
<span class="validity"></span>
</div>
<div>
<input type="submit" value="フォームを送信">
</div>
</form></pre>
<p>{{ EmbedLiveSample('Handling_browser_support', 600, 100) }}</p>
<p><code>nnnn-nn</code> のパターン (<code>n</code> は数字の0から9) に一致しない文字列を入力して送信しようとすると、エラーメッセージが表示される (そして入力欄が無効として強調表示される) のが分かるでしょう。もちろん、これでユーザーが無効な日付を入力したり (<code>0000-42</code> など)、パターンに合わない誤った書式の日付が入力されたりすることを止めることはできません。</p>
<p>また、ユーザーが数ある日付形式の中で期待されるものがどれであるかを知らない可能性もあります。後はその分の作業が残っています。</p>
<div class="hidden">
<pre class="brush: css notranslate">div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid+span:after {
position: absolute;
content: '✖';
padding-left: 5px;
}
input:valid+span:after {
position: absolute;
content: '✓';
padding-left: 5px;
}</pre>
</div>
<p>(すべての主要なブラウザーが対応するまでの間) ブラウザーに依存しない方法によってフォームで日付を扱う最善の方法は、ユーザーが年と月を別々なコントロール ({{htmlelement("select")}} 要素が一般的です。以下の実装を見てください) に入力するようにするか、 <a href="https://jqueryui.com/datepicker/">jQuery date picker</a> のような JavaScript ライブラリを使用することです。</p>
<h2 id="Examples" name="Examples">例</h2>
<p>この例では、ユーザーが都市と月を選択できるよう設計されたユーザーインターフェイスの要素を2組作成します。一つ目はネイティブの <code>month</code> 入力欄であり、もう一つは年と月を個別に選択することができる一組の {{HTMLElement("select")}} 要素で、まだ <code><input type="month"></code> に対応していないブラウザーのためのものです。</p>
<p>{{EmbedLiveSample('Examples', 600, 140)}}</p>
<h3 id="HTML">HTML</h3>
<p>年と月を入力するフォームはこのようになります。</p>
<pre class="brush: html notranslate"><form>
<div class="nativeDatePicker">
<label for="month-visit">何月にいらっしゃいますか?</label>
<input type="month" id="month-visit" name="month-visit">
<span class="validity"></span>
</div>
<p class="fallbackLabel">何月にいらっしゃいますか?</p>
<div class="fallbackDatePicker">
<div>
<span>
<select id="year" name="year">
</select>
<label for="year">年</label>
</span>
<span>
<select id="month" name="month">
<option selected>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
<label for="month">月</label>
</span>
</div>
</div>
</form></pre>
<p><code>nativeDatePicker</code> の ID がついた {{HTMLElement("div")}} は、年と月をリクエストするために <code>month</code> 入力欄を用いるのに対し、 <code>fallbackDatePicker</code> の ID がついた <code><div></code> は代わりに一組の <code><select></code> 要素を使用します。一つ目は年を、二つ目は月を入力します。</p>
<p>月を選択する <code><select></code> は、変化しないので月をハードコーディングしています (ローカライズの問題が残っていますが)。年に利用できる値は、現在の年に応じて動的に生成されます (どのように動作するかについての詳細な説明は、以下のコードのコメントを参照してください)。</p>
<div class="hidden">
<pre class="brush: css notranslate">div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid+span:after {
position: absolute;
content: '✖';
padding-left: 5px;
}
input:valid+span:after {
position: absolute;
content: '✓';
padding-left: 5px;
}</pre>
</div>
<h3 id="JavaScript">JavaScript</h3>
<p>どちらの方法を使用するかを選択し、非ネイティブの年の <code><select></code> に年の一覧を設定する JavaScript コードは以下の通りです。</p>
<p>この例の面白いもう一つの部分は、機能の検出コードです。ブラウザーが <code><input type="month"></code> に対応しているかどうかを検出するために、新たな {{htmlelement("input")}} 要素を生成し、その <code>type</code> を <code>month</code> に設定して、すぐに type に何が設定されたかをチェックします。対応していないブラウザーでは、 <code>month</code> が フォールバックされて <code>text</code> が返されます。 <code><input type="month"></code> に対応していない場合は、ネイティブの日付選択を非表示にしてフォールバック用の選択ユーザーインターフェイスを表示します。</p>
<pre class="brush: js notranslate">// define variables
var nativePicker = document.querySelector('.nativeDatePicker');
var fallbackPicker = document.querySelector('.fallbackDatePicker');
var fallbackLabel = document.querySelector('.fallbackLabel');
var yearSelect = document.querySelector('#year');
var monthSelect = document.querySelector('#month');
// hide fallback initially
fallbackPicker.style.display = 'none';
fallbackLabel.style.display = 'none';
// test whether a new date input falls back to a text input or not
var test = document.createElement('input');
try {
test.type = 'month';
} catch (e) {
console.log(e.description);
}
// if it does, run the code inside the if() {} block
if(test.type === 'text') {
// hide the native picker and show the fallback
nativePicker.style.display = 'none';
fallbackPicker.style.display = 'block';
fallbackLabel.style.display = 'block';
// populate the years dynamically
// (the months are always the same, therefore hardcoded)
populateYears();
}
function populateYears() {
// get the current year as a number
var date = new Date();
var year = date.getFullYear();
// Make this year, and the 100 years before it available in the year <select>
for(var i = 0; i <= 100; i++) {
var option = document.createElement('option');
option.textContent = year-i;
yearSelect.appendChild(option);
}
}</pre>
<div class="note">
<p><strong>注</strong>: 53週ある年もあることを忘れないでください(<a href="https://en.wikipedia.org/wiki/ISO_week_date#Weeks_per_year">年あたりの週数</a>を参照)。商品のアプリを開発するときはこれを念頭に置いておく必要があります。</p>
</div>
<h2 id="Specifications" name="Specifications">仕様書</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">仕様書</th>
<th scope="col">状態</th>
<th scope="col">備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('HTML WHATWG', 'forms.html#month-state-(type=month)', '<input type="month">')}}</td>
<td>{{Spec2('HTML WHATWG')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>
<p>{{Compat("html.elements.input.input-month")}}</p>
<h2 id="See_also" name="See_also">関連情報</h2>
<ul>
<li>全般的な {{HTMLElement("input")}} およびその操作に使用する{{domxref("HTMLInputElement")}} インターフェイス</li>
<li><a href="/ja/docs/Web/HTML/Date_and_time_formats">HTML で使用される日付と時刻の書式</a></li>
<li><a href="/ja/docs/Web/Guide/HTML/Forms/The_native_form_widgets#Date_and_time_picker">日付と時刻の選択のチュートリアル</a></li>
<li><code><a href="/ja/docs/Web/HTML/Element/input/datetime-local"><input type="datetime-local"></a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/date"><input type="date"></a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/time"><input type="time"></a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/week"><input type="week"></a></code></li>
<li><a href="/ja/docs/Learn/Forms/Property_compatibility_table_for_form_controls">CSS プロパティの互換性</a></li>
</ul>
|