2019年7月3日

フォーム:イベントとメソッド submit

submit イベントは、フォームが送信されるとトリガーされます。通常は、サーバーに送信する前にフォームを検証したり、送信を中止してJavaScriptで処理したりするために使用されます。

メソッド form.submit() を使用すると、JavaScriptからフォーム送信を開始できます。動的に独自のフォームを作成してサーバーに送信するために使用できます。

それらの詳細を見ていきましょう。

イベント:submit

フォームを送信する主な方法は2つあります。

  1. 1つ目は、<input type="submit"> または <input type="image"> をクリックすることです。
  2. 2つ目は、入力フィールドで Enter キーを押すことです。

どちらのアクションも、フォームで submit イベントが発生します。ハンドラーはデータをチェックし、エラーがある場合はそれらを表示して event.preventDefault() を呼び出すことができます。そうすると、フォームはサーバーに送信されません。

以下のフォームで

  1. テキストフィールドに移動して Enter キーを押します。
  2. <input type="submit"> をクリックします。

どちらのアクションも alert を表示し、return false のためフォームはどこにも送信されません。

<form onsubmit="alert('submit!');return false">
  First: Enter in the input field <input type="text" value="text"><br>
  Second: Click "submit": <input type="submit" value="Submit">
</form>
submitclick の関係

入力フィールドで Enter キーを使用してフォームを送信すると、<input type="submit">click イベントがトリガーされます。

実際にはクリック操作は一切行われていないのに、これは少し面白いですね。

デモはこちらです。

<form onsubmit="return false">
 <input type="text" size="30" value="Focus here and press enter">
 <input type="submit" value="Submit" onclick="alert('click')">
</form>

メソッド:submit

フォームをサーバーに手動で送信するには、form.submit() を呼び出すことができます。

この場合、submit イベントは生成されません。プログラマーが form.submit() を呼び出す場合、スクリプトですでに関連する処理がすべて行われていると見なされます。

このようなフォームを手動で作成して送信するために使用される場合があります。

let form = document.createElement('form');
form.action = 'https://google.com/search';
form.method = 'GET';

form.innerHTML = '<input name="q" value="test">';

// the form must be in the document to submit it
document.body.append(form);

form.submit();

課題

重要度:5

メッセージ html、入力フィールド、OK/CANCEL ボタンを持つフォームを表示する関数 showPrompt(html, callback) を作成します。

  • ユーザーはテキストフィールドに何かを入力して Enter キーまたは OK ボタンを押す必要があります。その後、入力した値を使用して callback(value) が呼び出されます。
  • それ以外の場合は、ユーザーが Esc キーまたは CANCEL を押すと、callback(null) が呼び出されます。

どちらの場合も、入力プロセスが終了し、フォームが削除されます。

要件

  • フォームはウィンドウの中央に配置する必要があります。
  • フォームは*モーダル*です。つまり、ユーザーがフォームを閉じるまで、ページの他の部分とのインタラクションはできません。
  • フォームが表示されると、ユーザーのために<input> 内にフォーカスを設定する必要があります。
  • Tabキー/Shift+Tabキーでフォームフィールド間でフォーカスを移動でき、他のページ要素にフォーカスが移動しないようにする必要があります。

使用例

showPrompt("Enter something<br>...smart :)", function(value) {
  alert(value);
});

iframe 内のデモ

追伸:ソースドキュメントには、固定位置付けのフォームの HTML/CSS がありますが、モーダルにするのはあなた次第です。

課題のためのサンドボックスを開きます。

モーダルウィンドウは、次のように、ウィンドウ全体を覆う半透明の <div id="cover-div"> を使用して実装できます。

#cover-div {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 9000;
  width: 100%;
  height: 100%;
  background-color: gray;
  opacity: 0.3;
}

<div> がすべてを覆っているため、下のページではなく、すべてのクリックを受け取ります。

また、body.style.overflowY='hidden' を設定することで、ページのスクロールを防止することもできます。

フォームは <div> の内ではなく、隣に配置する必要があります。なぜなら、opacity を適用したくないからです。

サンドボックスで解答を開きます。

チュートリアルマップ

コメント

コメントする前にこれを読んでください…
  • 改善点の提案がある場合は、コメントする代わりに GitHub issue またはプルリクエストを送信してください。
  • 記事の内容が理解できない場合は、詳しく説明してください。
  • 少数のコードを挿入するには<code>タグを使用し、複数行の場合は<pre>タグで囲み、10行を超える場合はサンドボックス(plnkrjsbincodepen…)を使用してください。