
* [CODE(HTMLa)@en[maxlength]] 属性 (HTML)

[1] [[HTML]] の [CODE(HTMLe)[[[input]]]] [[要素]]と
[CODE(HTMLe)@en[[[textarea]]]] [[要素]]の
[DFN[[CODE(HTMLa)[maxlength]] 属性]]は、
利用者が入力できる最大文字数を指定します。

[9]
:状態:[[W3C]] [[勧告]]、[[WHATWG]] [[WD]]
:[[要素型]]:
[CODE(HTMLe)@en[[[input]]]]、[CODE(HTMLe)@en[[[textarea]]]]
:[CODE(DOMa)@en[[[type]]]]:
[CODE(HTML)@en[[[text]]]]、
[CODE(HTML)@en[[[password]]]]、
[CODE(HTML)@en[[[email]]]]、
[CODE(HTML)@en[[[url]]]]、
[CODE(HTMLe)@en[[[textarea]]]]
:[[属性名]]:[CODE(HTMLa)@en[[[maxlength]]]]
([Q@en[maximum length]] ([Q[最大長]]) より)
:[[属性値]]:[[文字数]] (>>3)
:[[既定値]]:制限なし (>>4)

[2] 仕様書:
- [[HTML 4]]
-- [CODE(HTMLe)[input]] 要素 [CODE(HTMLa)[maxlength]] 属性
<IW:HTML4:"interact/forms.html#adef-maxlength">
- [[Web Forms 2.0]]
-- [CSECTION@en[2.5. Extensions to existing attributes]]
<IW:WF2:"#extensions0">


** 属性値

[3] この属性の値は [CODE(SGML)[[[NUMBER]]]] です。
最大の文字数を指定します。

[4] この属性は省略可能です。省略時は無制限と見なされます。 [SRC[HTML 4 17.4]]

** 数え方

[12]
[CODE(HTMLa)@en[[[maxlength]]]] [[属性]]の値は、
[[文字]]の[[数]] ([[符号位置]]の[[数]])
を制約します。
[SRC@en[WF2 2.5]]

[13] 
[CODE(HTMLe)@en[[[textarea]]]] では、
[[改行]]は、 [CODE(HTMLa)@en[[[wrap]]]]
[[属性]]の[[値]]に依存して追加されるものも含め、
1つ2[[文字]] ([CODE(charname)@en[[[CR]]]]
[CODE(charname)@en[[[LF]]]]) と数えます。
[SRC@en[WF2 2.5、2.14]]

[17]
この[[属性]]は[[初期値]] ([CODE(DOMa)@en[[[defaultValue]]]])
には影響[['''してはなりません''']]。
[[利用者]]の入力や[[妥当性検証]]にのみ影響[['''しなければなりません''']]。
[SRC@en[WF2 2.5]]

** 安全性

[16]
[[フォーム処理エージェント]]は、
悪意の有る[[利用者]]や[[不適合]]の[[利用者エージェント]]を考慮し、
[CODE(HTMLa)@en[[[maxlength]]]] [[属性]]が指定されていたとしても、
必要ならば入力値の長さの検査を[['''するべきです''']]。
[SRC@en[WF2 2.5]]

[[#comment]]


** 歴史

[6]
HTML 4 DTD の[[注釈]] (参考) には
[Q[max chars for text fields]]
と説明があります。

[10]
[CODE(HTMLa)@en[[[maxlength]]]] [[属性]]は、
[[HTML 4]] では [CODE(HTMLe)@en[[[input]]]]
[[要素]]の [CODE(HTML)@en[[[text]]]] と
[CODE(HTML)@en[[[password]]]] にだけ定義されていました。

[11]
[[Web Forms 2.0]] では、
[CODE(HTMLe)@en[[[input]]]] の
[CODE(HTML)@en[[[email]]]] と
[CODE(HTML)@en[[[url]]]]
にも適用されるようになりました。
また、 [CODE(HTMLe)@en[[[textarea]]]]
にも定義されました。

** 実装

[8]
[CITE[Bug 345267 - If the initial text input value is longer than maxlength it is truncated.]] <https://bugzilla.mozilla.org/show_bug.cgi?id=345267>
([[名無しさん]] [WEAK[2006-07-22 04:28:31 +00:00]])

[[#comment]]


** 関連

[5] この属性の値は、 [CODE(HTMLa)[[[size]]]] 属性の値を超えても構いません。
その場合は、 UA は何らかの scroll の仕組みを用意するべきです。
[SRC[HTML 4 17.4]]

[15]
[CODE(HTMLa)@en[[[maxlength]]]] が
[CODE(HTML)@en[[[text]]]], [CODE(HTML)@en[[[password]]]],
[CODE(HTML)@en[[[email]]]], [CODE(HTML)@en[[[url]]]],
[CODE(HTMLe)@en[[[textarea]]]]
に対して与えられ、その[[制御子]]が指定された[[数]]よりも多くの[[符号位置]]を含み、
''しかもその[[値]]が[[既定値]]とは[[一致]]しない''なら、
[CODE(DOM)@en[[[tooLong]]]] [[妥当性検証誤り]]が[[報告]]されます。
[SRC@en[WF2 2.5]]

[[#comment]]


** 例

[18]
[PRE(HTML example code)[
<input type="email" maxlength="1" name="test"/>
]PRE]

この[[制御子]]は、[[値が選択されていない]]ときだけ[[妥当]]になります。
[SRC@en[WF2 2.5]]

;; 長さが1の[[電子メイル・アドレス]]は存在しないからです。

[[#comment]]


** メモ

[7]
[[正規化]]や[[提出]]時の[[文字コード]]の変換によって、
同じ[[文字列]]のはずでも長さが変わって[CODE(HTMLa)@en[[[maxlength]]]]の制限を満たさなくなることがあります。

[14]
[CODE(HTML)@en[[[email]]]] や
[CODE(HTML)@en[[[url]]]]
で [CODE(HTMLa)@en[[[maxlength]]]]
[[属性]]を使うことは、
実際に[[フォーム処理エージェント]]で制限がある場合を除き、
[[非推奨]]とされています。
[[電子メイル・アドレス]]や [[URI]]
は[[著者]]の考える以上に長いことがざらにあるからです。
[SRC@en[WF2 2.5]]

[[#comment]]


* メモ

[32] [CITE['''['''whatwg''']''' Constraint validation for maxlength]]
([TIME[2010-07-24 16:00:43 +09:00]] 版)
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-July/027257.html>

[33] [CITE[IRC logs: freenode / #whatwg / 20100906]]
( ([TIME[2010-09-23 19:52:11 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20100906#l-844>

[34] [CITE@en[Web Applications 1.0 r6413  Semi-allow <input type=number maxlength> for legacy reasons.]]
( ([TIME[2011-08-11 08:54:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6412&to=6413>

[35] [CITE[maxlengthを使ってはいけない。特にパスワード入力欄で使っちゃ駄目! #UI #JavaScript #HTML - Qiita ''''''[''''''キータ'''''']'''''']]
( ([TIME[2013-04-18 05:33:00 +09:00]] 版))
<http://qiita.com/items/d462a05c113b8e063736>

[36] [CITE@ja-JP[Internet Explorer 11 で contenteditable 属性や maxlength 属性を設定した要素で日本語入力ができないことがある]]
( ([TIME[2014-01-29 01:26:22 +09:00]] 版))
<http://support.microsoft.com/kb/2922126/ja>

[19] [CITE@en[Change minlength/maxlength behavior around linebreaks]]
([[domenic]]著, [TIME[2016-08-26 16:10:16 +09:00]])
<https://github.com/whatwg/html/commit/163703186794c21daa92cc2718218afa44f26071>

[20] [CITE@en[1320229 - Consider warning if a value pasted in a password field is truncated due to max length]]
([TIME[2020-05-21 16:03:41 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1320229>

[21] [CITE@ja[なかのんの旅々(Masayuki Nakano)さんはTwitterを使っています: 「パスワードをmaxlengthで自動でtruncateする事を嫌った貢献者の方からパッチが出てきたので、Firefoxでそれを採用してみたことあるんやけど、とある企業向けのデカいアプリが壊れて、しかも担当の人がbugzilla上で「サーバー側で何もチェックしてないからやめろ」とか公言したことありまして。」 / Twitter]], [TIME[午後10:21 · 2023年7月12日][2023-07-12T13:21:09.000Z]], [TIME[2023-07-15T06:38:15.000Z]] <https://twitter.com/d_toybox/status/1679118700853723136>