submit イベントはフォームが送信されたときにトリガされます。通常、フォームをサーバーに送信する前に検証したり、送信を中止したり、JavaScriptで処理したりするために使用されます。
メソッド form.submit() で JavaScript からのフォーム送信を開始することができます。独自のフォームを動的に作成してサーバーに送信するために使用できます。
それらの詳細を見てみましょう。
フォームを送信する方法として、主に2つあります。:
<input type="submit"> または <input type="image"> をクリックします。両方のアクションは、フォーム上で submit イベントにつながります。ハンドラはデータのチェックができ、もしエラーがあればそれらを表示し event.preventDefault() を呼び出すと、フォームはサーバには送られません。
以下のフォームで:
<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>
submit と click の関係input フィールド上で 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>
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">';
// submit するためにフォームはドキュメント内になければなりません
document.body.append(form);
form.submit();
メッセージ html 入力フィールドとボタン OK/CANCEL を持つフォームを表示する関数 showPrompt(html, callback) を作成してください。
callback(value) が呼ばれます。callback(null) が呼ばれます。どちらの場合も、入力プロセスが終了したらフォームが削除されます。
要件:
<input> の中であるべきです。使用例:
showPrompt("Enter something<br>...smart :)", function(value) {
alert(value);
});
iframe でのデモ:
P.S. ソースドキュメントは固定された位置付けのフォーム用の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 をもたせたくはないからです。
コメント
<code>タグを使ってください。複数行の場合は<pre>を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。