HTML フォーム: ユーザー入力を収集するための基本
要約: HTML フォームは、ウェブページ上でユーザーからデータを収集するための重要な要素です。このドキュメントでは、フォームの基本的な構造、属性、および使用方法について説明します。また、フォームを使用してどのようにユーザーから情報を取得できるかを探ります。
<form>: フォーム要素
1. <form>: フォーム要素とは?
2. 属性
2.1 accept (非推奨)
2.2 accept-charset
2.3 autocapitalize (非標準)
none: 自動大文字化を行いません。 sentences: 文の先頭文字を大文字化します。 words: 単語の先頭文字を大文字化します。 characters: すべての文字を大文字化します。
2.4 autocomplete
off: ブラウザは自動補完を行いません。ただし、ログインフォームなど、ブラウザが安全でないと判断した場合は、この設定が無視されることがあります。 on: ブラウザは自動補完を行う場合があります。
2.5 name
2.6 rel
3. フォーム送信のための属性
3.1 action
3.2 enctype
application/x-www-form-urlencoded: これがデフォルトのエンコード方法です。 multipart/form-data: フォームにファイルアップロード用の <input type="file"> 要素が含まれている場合に使用します。 text/plain: デバッグ用途に適しています。
3.3 method
post: POST メソッドを使用します。フォームデータは、HTTPリクエストのボディに含めて送信されます。 get: GET メソッドを使用します。フォームデータは、URLの末尾にクエリ文字列として付加して送信されます。 dialog: フォームが <dialog> 要素内にある場合にのみ使用します。送信操作を行うと、ダイアログが閉じ、submit イベントが発生しますが、データは送信されません。
3.4 novalidate
3.5 target
_self (デフォルト): 現在のブラウザウィンドウまたはタブにレスポンスを表示します。 _blank: 新しいブラウザウィンドウまたはタブにレスポンスを表示します。 _parent: 親フレームにレスポンスを表示します。 _top: 最上位のフレームにレスポンスを表示します。 <iframe> の名前: 指定した名前の <iframe> にレスポンスを表示します。
4. 例
4.1 GETリクエストを送信するフォーム
<form method="get">
<label for="name">Name:</label>
<input type="text" id="name" name="name" autocomplete="name">
<button type="submit">Save</button>
</form>
4.2 POSTリクエストを送信するフォーム
<form method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" autocomplete="name">
<button type="submit">Save</button>
</form>
4.3 fieldset, legend, label のあるフォーム
<form method="post">
<fieldset>
<legend>Do you agree to the terms?</legend>
<label>
<input type="radio" name="agreement" value="yes"> Yes
</label>
<label>
<input type="radio" name="agreement" value="no"> No
</label>
</fieldset>
<button type="submit">Submit</button>
</form>
5. 結果
GET リクエストを送信するフォーム: フォームを送信すると、入力された名前がURLのクエリ文字列に付加されます。 POST リクエストを送信するフォーム: フォームを送信すると、入力された名前がHTTPリクエストのボディに含めて送信されます。 fieldset, legend, label のあるフォーム: ラジオボタンで選択した値がサーバーに送信されます。
6. 技術的概要
コンテンツカテゴリー: フローコンテンツ、知覚可能コンテンツ 許可されている内容: フローコンテンツ。ただし、<form>要素を内包することはできません。 タグの省略: なし。開始タグと終了タグの両方が必須です。 許可されている親要素: フローコンテンツを受け入れるすべての要素 暗黙の ARIA ロール: form (フォームにアクセシブル名がある場合)、それ以外の場合は対応するロールなし 許可されている ARIA ロール: search, none, presentation DOM インターフェイス: HTMLFormElement
7. ブラウザーの互換性
バリデーションとセキュリティ
フォームデータの収集時には、バリデーションを行い、適切なセキュリティ対策を講じることが重要です。このセクションでは、クライアント側およびサーバー側のバリデーションのベストプラクティスについて説明します。
クライアント側バリデーションは、ユーザーがフォームを送信する前に入力データをチェックします。一方、サーバー側バリデーションは、送信されたデータが正しいかどうかを確認します。例えば、必須フィールドが空白ではないか、メールアドレスの形式が正しいかなどを確認します。
適切なセキュリティ対策には、データのサニタイズやエスケープ処理が含まれます。これにより、悪意のあるユーザーからの攻撃を防ぐことができます。
formタグの使い方
formタグ
action 属性 : フォームデータの送信先URLを指定します。データを受け取って処理するサーバーサイドのプログラムのURLを記述します。method 属性 : データの送信方法(HTTPメソッド)を指定します。主にGETとPOSTの2種類があります。GET: データをURLの末尾にクエリ文字列として付加して送信します。 POST: データをHTTPリクエストのボディに含めて送信します。
<form action="/submit.php" method="post">
<!-- フォームの入力部品 -->
</form>
labelタグ
<label for="name">氏名:</label>
<input type="text" id="name" name="name">
inputタグ
type 属性 : 入力フィールドの種類を指定します。代表的な値は以下の通りです。text: 1行のテキスト入力フィールド password: パスワード入力フィールド (入力した文字は隠される) email: メールアドレス入力フィールド checkbox: チェックボックス radio: ラジオボタン submit: 送信ボタン reset: リセットボタン
id 属性 : 入力フィールドを一意に識別するためのIDを指定します。name 属性 : フォームデータを送信する際に、入力フィールドに名前を付けて送信します。サーバーサイドでデータを受け取る際に、この名前で識別されます。
<input type="text" id="name" name="name" placeholder="氏名">
<input type="password" id="password" name="password" placeholder="パスワード">
<input type="checkbox" id="agreement" name="agreement" value="yes"> 同意する
<input type="submit" value="送信">
textareaタグ
id 属性 : 入力フィールドを一意に識別するためのIDを指定します。name 属性 : フォームデータを送信する際に、入力フィールドに名前を付けて送信します。rows 属性 : 表示する行数を指定します。cols 属性 : 表示する列数を指定します。
<label for="message">メッセージ:</label>
<textarea id="message" name="message" rows="10" cols="50"></textarea>
まとめ
参考文献: MDN Web Docs - HTML form element
よくある質問
- Q1: HTML フォームの最大の利点は何ですか?
- A1: HTML フォームは、ユーザーからデータを簡単に収集できるインターフェースを提供します。
- Q2: GET メソッドと POST メソッドの違いは何ですか?
- A2: GET メソッドはデータを URL に付加して送信し、POST メソッドはデータをリクエストボディに含めて送信します。
- Q3: バリデーションはどのように行いますか?
- A3: HTML5 では、required 属性や pattern 属性を使用して簡単にクライアント側でバリデーションを行えます。サーバー側では、送信されたデータをチェックするロジックを構築します。