Skip to content
This page has been auto-translated and may contain errors.View in English

フォームと入力

docs.scrimba.com

検索ボックス、ログイン、チェックアウト、コメント欄など、あなたのために何かをするほぼすべてのウェブサイトはフォームを基盤としています。フォームは、ページが訪問者に話しかけることを止めて、聞き始める方法です。誰かが入力したもの、チェックしたもの、または選択したものを収集し、そのデータを処理するために渡します。この章は、それを可能にするHTMLについてです。

formエレメント

フォーム は、訪問者が入力するものをグループ化するコンテナです。入力とボタンを <form> エレメント内にラップすると、フォームの役割は、訪問者が完了したときにすべてを集めて送信することです。

html
<form>
  <label>お名前</label>
  <input>
  <button>送信</button>
</form>

医者の診療所で記入する紙のフォームのようなものと考えてください。シートはすべてのボックスを保持し、それぞれに記入し、下部に全体のシートを一度に返します。<form> エレメントがそのシートです。

<form> は、そのコントロールを収集して1つのバンドルとして送信するコンテナです。送信時の動作を決定する2つの属性があります。action はデータが送信されるアドレスで、method はそれがどのように送信されるかです。

html
<form action="/subscribe" method="post">
  <label for="email">メールアドレス</label>
  <input id="email" name="email" type="email">
  <button type="submit">購読</button>
</form>

訪問者が送信をトリガーすると、ブラウザはフォーム内のすべての名前付きコントロールを収集し、値をパッケージ化し、action アドレスにリクエストを送信します。これをあなた自身で配線する必要はありません。<form> エレメントはこの動作を無料で提供します。そのため、ページ上にコントロールをグループ化することは、ばらばらな入力を散在させるより良いです。

<form> はネイティブな 送信 メカニズムです。フォームのコントロールをリクエストに集め、スクリプティングを必要とせずに送信する組み込みのブラウザ動作です。送信時、ブラウザは action (リクエストが送られるURL) と method (get または post、この章の後半で説明) を読み、コントロールをリクエストにシリアル化し、ナビゲートします。そのデフォルトは、JavaScriptが無効になっているか、まだロードされていないときにもフォームが機能する理由です。これは、あなたが置き換える代わりに、その上に構築する基準線です。

html
<form action="/subscribe" method="post">
  <label for="email">メールアドレス</label>
  <input id="email" name="email" type="email">
  <button type="submit">購読</button>
</form>

2つの動作が人々を当惑させます。1つ目は、フォームはボタンをクリックしたときだけでなく、単一行のテキストフィールドにフォーカスがあるときにEnterで送信されることです。そのため、キーボード送信は組み込まれており、テストする価値があります。2つ目は、デフォルト送信がページをリロードするか、ナビゲートすることです。JavaScriptでフォームを処理するときは、event.preventDefault() を呼び出してそのナビゲーションを停止し、制御を引き継ぎます。ネイティブ送信を基準として扱います。スクリプトが実行される前でも、何か意味のあることをするべきです。段階的エンハンスメント、動作するHTMLの上にスクリプトを重ね合わせることは、ここから始まる理由です。

Junoformエレメント<form> は、入力とボタンを保持するコンテナであり、誰かが送信したときにすべてを一緒に送信します。机上の紙のフォームを想像してください。1つのシート、たくさんのボックス、一度に返されます。フィールドをフォームでラップすると、何か賢いことをしなくても、収集して送信する動作が得られます。
Junoformエレメント<form> は、そのコントロールをバンドルして送信します。action は送信先を示し、method は方法を示します。収集と送信は無料で得られるので、独自のクリックハンドラーを持つ緩い入力の代わりに、実際のフォームを使用してください。これはコードを節約し、スクリプトがロードされる前に機能します。
Junoformエレメント ネイティブ送信はコントロールを集め、スクリプトを使用せずに action にリクエストを送信します。これはまさに、JavaScriptがオフの場合にもフォームが機能する理由です。テキストフィールドではEnterで送信され、クリックだけではないことを覚えておいてください。JavaScriptで制御を引き継ぐときは、event.preventDefault() がデフォルトのナビゲーションを停止し、その下の単純なフォームはあなたのセーフティネットのままです。

入力とラベル

<input> は訪問者が入力するボックスです。ただし、それ自体では、入力は何のためのものかを示唆しない空のボックスです。それが ラベル の役割です。訪問者にボックスに何を入れるかを告げるテキストの部分です。

html
<label for="city">都市</label>
<input id="city">

すべての入力にはラベルが必要です。入力に id を与え、ラベルに for でそれを指して、両方で同じ単語を使用することで、2つを接続します。リンクされたら、ラベルをクリックするとカーソルがボックスに入り、これはフォームをすべての人にとって使いやすくする小さな親切です。

<input> は単一の値を収集し、<label> はそれに名前を付けます。ラベルの for 属性を入力の id と一致させることで、それらを関連付けます。

html
<label for="username">ユーザー名</label>
<input id="username" name="username" type="text" required>

いくつかの属性はほとんどの入力に場所を稼ぎます。name は値が送信されるキーです (命名セクションで説明)。required はフィールドが入力されるまで送信をブロックします。placeholder はボックス内にかすかなヒントテキストを表示しますが、プレースホルダーはラベルではありません。誰かが入力した瞬間に消えるため、本物に置き換えることはできません。すべての入力にはまだ独自の <label> が必要です。

<label> をそのコントロールに関連付けるには2つの方法があり、その区別はアクセシビリティにとって重要です。1つ目は 明示的な関連付け です。ラベルには、コントロールの id に等しい値を持つ for 属性があります。2つ目は 暗黙的な関連付け です。コントロールをラベルエレメント内にラップし、for または id は不要です。

html
<!-- 明示的: for が id と一致する -->
<label for="phone">電話</label>
<input id="phone" name="phone" type="tel">

<!-- 暗黙的: input がラベルの内側にある -->
<label>
  電話
  <input name="phone" type="tel">
</label>

どちらもコントロールに アクセシブルな名前 を与えます。これはフィールドがフォーカスを得たときにスクリーンリーダーが告知するテキストです。そのため、レイアウトを見ることができない訪問者は、何を入力するかを知っています。明示的な関連付けを優先します。CSSレイアウトがラベルを入力から離す場合でも機能し、スタイリングが2つを離す場合に機能します。関連付けられたラベルのないフィールドは、目的のない単なる編集ボックスとして告知され、これはウェブ上で最も一般的なアクセシビリティ障害の1つです。アクセシビリティ の章はこれについて詳しく説明しています。

Juno入力とラベル<input> は人々が入力するボックスで、<label> はそこに何が行くかを告げるテキストです。一致する forid でそれらをリンクし、ラベルをクリックするとボックスに直接ジャンプします。すべての単一の入力にラベルを付けます。単語のない孤独なボックスは、人々を混乱させるだけです。
Juno入力とラベル ラベルの for を入力の id と一致させると、2つがリンクされます。required を利用して空の送信をブロックしますが、placeholder をラベルの代わりにしないでください。誰かが入力した瞬間に消えます。本物のラベル、すべてのフィールド、例外なし。
Juno入力とラベル ラベルをリンクする2つの方法: forid と一致するか、ラベル内に入力をラップします。どちらもフィールドにアクセシブルな名前を与え、スクリーンリーダーが読み出すテキストで、CSSが物を引き離すときは明示的な for/id がより丈夫な選択肢です。ラベルのないフィールドは名前のないボックスとして読み取られます。これはそこにある最も一般的なアクセシビリティのミスの1つです。

その他のコントロール

すべてが単純なテキストボックスではありません。いくつかの質問は、チェック、選択、またはリストから選択することでより良く答えられます。チェックボックス (checkbox) はオン/オフスイッチで、ドロップダウンでは複数のオプションから1つを選択できます。

html
<label>
  <input type="checkbox"> ニュースレターを送ってください
</label>

<label for="size">サイズ</label>
<select id="size">
  <option>小</option>
  <option>中</option>
  <option>大</option>
</select>

これらを暗記する必要はありません。重要なのは、フォームは適切な方法で質問をすることができるということです。入力、チェック、またはリストから選択します。

<input> エレメントは type 属性に基づいて形を変え、正しいタイプは無料でより良いキーボード、組み込み検証、およびネイティブピッカーを提供します。

html
<input type="email">     <!-- @ の形を検証し、モバイルではメールキーボード -->
<input type="number">    <!-- 数値キーパッド、上下ステッパー -->
<input type="password">  <!-- 文字をマスク -->
<input type="date">      <!-- ネイティブ日付ピッカー -->
<input type="checkbox">  <!-- 単一のオン/オフトグル -->
<input type="radio">     <!-- グループから1つを選択 -->

<input> を超えて、3つのエレメントが残りをカバーします。<textarea> はより長い執筆用の複数行のテキストボックスです。<option> 子を持つ <select> はドロップダウンリストです。関連フィールドを視覚的にセマンティックにグループ化する必要がある場合、<fieldset> にラップして、グループに名前を付ける <legend> を使用します。

html
<fieldset>
  <legend>配送速度</legend>
  <label><input type="radio" name="speed" value="standard"> 標準</label>
  <label><input type="radio" name="speed" value="express"> 急速</label>
</fieldset>

<label for="message">メッセージ</label>
<textarea id="message" name="message" rows="4"></textarea>

ボタンも type を持ちます。type="submit" はフォームを送信し (フォーム内のボタンのデフォルト)、type="reset" はすべてのフィールドを開始値にクリアし、type="button" は単独では何もしませんが、JavaScriptがフックされるためにあります。

各コントロールタイプは、出荷前に知る価値のある動作を実行します。ラジオボタンは共有 name でグループ化されます。グループ内の1つのラジオのみを選択でき、そのグループ化はそれらを相互に排他的にします。したがって、欠落または不一致の name はグループを静かに独立したトグルに分割します。

html
<fieldset>
  <legend>配送速度</legend>
  <label><input type="radio" name="speed" value="standard" checked> 標準</label>
  <label><input type="radio" name="speed" value="express"> 急速</label>
</fieldset>

<fieldset><legend> は視覚的なだけではありません。<legend> はセット内のすべてのコントロールの文脈としてスクリーンリーダーによって告知されるため、「配送速度」フィールドセット内のラジオは「配送速度、標準」として読み取られます。これは、わかりやすいフォームと係留されていないオプションのリストの違いです。さらに2つの本番注記があります。チェックボックスはチェックされているときのみその値を送信します。チェックされていないボックスは送信から完全に欠落しているため、サーバーは false ではなく何も見えません。これは、反対側のデータの読み取り方を形作ります。そして type="submit" はフォーム内の <button> のデフォルトタイプであるため、JavaScriptトリガーとして意図した単純な <button> は、type="button" を設定しない限り、フォームを送信してページをリロードします。そのデフォルトは人々を絶えず捕捉します。

Junoその他のコントロール フォームは複数の方法で尋ねることができます。はい/いいえにチェックボックス、リストから1つのものを選択するためのドロップダウン。チェックボックスは <input type="checkbox"> で、ドロップダウンは <option> 選択を保持する <select> です。それらを暗記する必要はありません。質問が必要なとき、フォームは単純なボックスよりも多くがあります。
Junoその他のコントロール 入力の type はそれを再形成します: emailnumberdatepasswordcheckboxradio、それぞれ適切なキーボードまたはピッカー付き。長いテキストには <textarea> に、ドロップダウンには <select> に、関連フィールドをグループ化するには <legend> を持つ <fieldset> に手を伸ばしてください。ボタンの種類を見てください: submit はフォーム内のデフォルトです。
Junoその他のコントロール ラジオは共有 name でグループ化され、<legend> はフィールドセット内のすべてのコントロールに話された文脈を与えます。これは構造であり、装飾ではありません。2つのトラップ: チェックされていないチェックボックスは false ではなく、何も送信せず、単純な <button>type="submit" にデフォルトされるため、type="button" を設定しない限りページをリロードします。

フォームデータの命名と送信方法

フォームが送信されると、各回答はラベルが必要であり、それを受け取る人がどのボックスからきたのかを知ることができます。そのラベルは入力の name です。一度設定すると、値と共に移動します。

html
<label for="city">都市</label>
<input id="city" name="city">

訪問者がそのボックスに「東京」と入力した場合、フォームは「city is 東京」というペアを送信します。name は、受信側がある回答を別の回答から区別する方法です。name のない入力は、送信から完全に除外されるため、この小さな属性は、データが実際に表示されるようにするものです。

フォームデータは 名前/値ペア のセットとして送信されます。各コントロールの name がキーになり、訪問者が入力したものが値になります。name を持つコントロールのみが含まれるため、name は、コントロールを送信されたデータに変えるものです。

html
<form action="/search" method="get">
  <label for="q">検索</label>
  <input id="q" name="q" type="search">
  <label for="sort">並び順</label>
  <select id="sort" name="sort">
    <option value="recent">最新順</option>
    <option value="top">評価が高い順</option>
  </select>
  <button type="submit">検索</button>
</form>

method 属性は、これらのペアがどのように移動するかを選択します。method="get" はそれらをクエリ文字列としてURLに追加します (/search?q=boots&sort=recent)。これは、ブックマークまたは共有する可能性のある検索とフィルターに適しています。method="post" はそれらをリクエストボディに置き、見えなくなります。これは、パスワードや支払いなど、データを変更する、またはURLに存在すべきでないすべてのものに適しています。

すべての送信は名前/値ペアのセットであり、3つの詳細は、それらのエンコード方法と送信方法を決定します。

method が最初です。get はペアをURLに クエリ文字列 として、アドレスの後の ?key=value&key=value テキストにシリアル化します。これにより、リクエストは繰り返し可能でブックマーク可能になり、値がURLに表示され、ブラウザ履歴とサーバーログに表示されるため、get は読み取り (検索、フィルター) であり、秘密には決してありません。post は代わりにペアをリクエストボディに運び、URLから外れます。これは、状態を変更するか、機密である何かの選択です。

enctype は2番目です。エンコーディング は、ボディがどのようにフォーマットされるかを示しています。デフォルトの application/x-www-form-urlencoded は、ペアを1つの key=value&... 文字列にパックします。これはテキストには問題ありません。選択したファイルを送信するには、enctype="multipart/form-data" に切り替える必要があります。これは、テキストフィールドと共にファイルバイトを実行できる形式です。ファイル入力は、それなしでは正しくアップロードされません。

html
<form action="/upload" method="post" enctype="multipart/form-data">
  <label for="avatar">プロフィール写真</label>
  <input id="avatar" name="avatar" type="file">
  <button type="submit">アップロード</button>
</form>

3番目は autocomplete で、命名がUXとアクセシビリティで支払い戻す場所です。autocomplete トークンは、ブラウザにフィールドが標準用語で何を意味するかを伝えるため、正しい保存された値を提供できます: autocomplete="email"autocomplete="name"autocomplete="current-password"autocomplete="street-address"。これらのトークンは固定の語彙で、自由なテキストではなく、それらを正しく取得することで、ブラウザまたはパスワードマネージャーが1回のタップでフォームを入力でき、電話でタイピングまたはアシスティブテクノロジーを使用している人にとって最も重要です。

html
<label for="email">メール</label>
<input id="email" name="email" type="email" autocomplete="email">

組み込みチェックを誠実に保つことは、フォーム検証 の章で説明されている別の仕事です。このセクションはデータが有効になったら、それがどのように形成され、送信されるかについてです。

Junoフォームデータの命名と送信方法 各入力の name は、その回答のタグです。したがって、受信者は、値が都市ボックスからきたのであり、メールボックスからではないことを知っています。name を設定すると、ボックスの値はラベルされたペアとして送信されます。それを忘れると、そのフィールドは黙って除外されます。これは、多くの人が初めてフォームが何も返さないときに引っかかります。
Junoフォームデータの命名と送信方法 送信されたデータは名前/値ペアで、name を持つコントロールのみが含まれます。仕事に合った method を選択してください。get はブックマークする可能性のある検索とフィルターのためにURLに値を入れ、post はそれをボディに隠す。データを変更する、または秘密を保持する何かのためにボディに入れます。URLのパスワードは、決して犯してはならない間違いです。
Junoフォームデータの命名と送信方法get はペアをURLに書き込むため、読み取り用であり、決して秘密のためではありません。post はそれをボディに運びます。ファイル入力がアップロードされないか、enctypemultipart/form-data に切り替えます。そして emailcurrent-password などの autocomplete トークンに努力を費やしてください。それらは固定の語彙で、それらを正しく取得することで、電話またはパスワードマネージャーはフォームを1回のタップで入力できます。