JavaScriptでフォーム送信イベントをリッスンするにはどうすればよいですか?


124

私は自分のフォーム検証JavaScriptライブラリを書きたいと思っています。送信ボタンがクリックされたかどうかを検出する方法をGoogleで探していましたがonSubmit="function()"、HTMLでonClick onを使用する必要があるコードだけが見つかりました。

このJavaScriptを作成して、onSubmitやonClick javascriptを追加するようなHTMLコードに触れないようにします。


8
なんでdocument.forms['yourForm'].onsubmit = function(){}?またはaddEventListener
ジョセフ・シルバー

3
本当に送信ボタンがクリックされたかどうかを確認しますか、それともユーザーがフォームを送信したかを確認しますか(ボタンをクリックするか、フィールドの1つからEnterキーを押すことで実行できます)?
nnnnnn 2011

回答:


506

なぜ人々は必要のないときにjQueryを常に使用するのですか?
なぜ人々は単純なJavaScriptを使用できないのですか?

var ele = /*Your Form Element*/;
if(ele.addEventListener){
    ele.addEventListener("submit", callback, false);  //Modern browsers
}else if(ele.attachEvent){
    ele.attachEvent('onsubmit', callback);            //Old IE
}

callback フォームが送信されているときに呼び出す関数です。

についてはEventTarget.addEventListenerMDNに関するこのドキュメントをご覧ください

ネイティブsubmitイベントをキャンセルする(フォームが送信されないようにする)に.preventDefault()は、コールバック関数で使用します。

document.querySelector("#myForm").addEventListener("submit", function(e){
    if(!isValid){
        e.preventDefault();    //stop form from submitting
    }
});

submitライブラリでイベントを聞く

何らかの理由でライブラリが必要だと判断した場合(既に使用しているか、ブラウザ間の問題に対処したくない場合)は、一般的なライブラリで送信イベントをリッスンする方法のリストを次に示します。

  1. jQuery

    $(ele).submit(callback);

    ここで、eleフォーム要素の参照であり、callbackコールバック関数の参照です。参照

  1. AngularJS(1.x)

    <form ng-submit="callback()">
    
    $scope.callback = function(){ /*...*/ };

    非常に簡単です。コントローラ$scope内のフレームワークによって提供されるスコープはどこですか。参照

  2. 反応する

    <form onSubmit={this.handleSubmit}>
    
    class YourComponent extends Component {
        // stuff
    
        handleSubmit(event) {
            // do whatever you need here
    
            // if you need to stop the submit event and 
            // perform/dispatch your own actions
            event.preventDefault();
        }
    
        // more stuff
    }

    ハンドラをonSubmit小道具に渡すだけです。参照

  3. その他のフレームワーク/ライブラリ

    フレームワークのドキュメントを参照してください。


検証

JavaScriptでいつでも検証を行うことができますが、HTML5ではネイティブの検証も可能です。

<!-- Must be a 5 digit number -->
<input type="number" required pattern="\d{5}">

JavaScriptも必要ありません。ネイティブ検証がサポートされていない場合はいつでも、JavaScriptバリデーターにフォールバックできます。

デモ:http : //jsfiddle.net/DerekL/L23wmo1L/


106
この5行の「恐ろしい...醜い」コードは、4,000行のjQueryによって提供される必要な機能を置き換えます。これは、「恐ろしく...醜い」コードでもある必要があります。
RobG 2011

45
私はjQueryに対してそれほど多くはありません。jQueryを全体を数行のコードで置き換えることができることに気付かずに一種の魔法の呪文としてそれを使用する人だけです。時間をかけて、ブラウザが実際にどのように機能するかを調べてみませんか?それほど難しいことではありません。
RobG 2011

4
@Ben-そして、あなたがライブラリで何かをすることができるからといって、あなたがそうすべきだという意味でも、他の人が「ただライブラリxを使う」という返答で基本を学ぶのをやめさせられるべきでもありません。誰かがJavaScriptについて特定の質問をするとき、プレーンなJavaScriptを使用して質問に答えるのは丁寧です。必ず、選択したライブラリから何かを提案しますが、質問への回答が最優先事項です。
RobG 2011

4
私は個人が最初に基本を知っているべきだと個人的に信じています。
Derek━會功夫

7
同じ精神で、私たちはもっと多くのアセンブリ言語を書いてみるべきです。冗談(私はjqueryソリューションをかなり好んでおり、内部で何が起こっているのかを本当に理解したいのであれば、それは無限のうさぎの穴だと思います)ですが、はい、アセンブリ言語を知っていて、TCP接続が確立された、など。私はまだ、何が入っているのかについての不思議を彼らに教えるためだけに、下位レベルのソリューションを誰にも渡さないでしょう。
Josh Sutterfield、2016

6

これは、onSubmit発生時に独自のJavaScript関数を呼び出す最も簡単な方法です。

HTML

<form>
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>

JavaScript

window.onload = function() {
    var form = document.querySelector("form");
    form.onsubmit = submitted.bind(form);
}

function submitted(event) {
    event.preventDefault();
}

3
なぜ「送信済み」関数をバインドすることにしたのですか?関数内で「this」を使用することはできません。
Lior

bind確かに不要です。
pstadler

3

要件に基づいて、jQueryのようなライブラリなしで以下を実行することもできます。

これを頭に追加してください:

window.onload = function () {
    document.getElementById("frmSubmit").onsubmit = function onSubmit(form) {
        var isValid = true;
        //validate your elems here
        isValid = false;

        if (!isValid) {
            alert("Please check your fields!");
            return false;
        }
        else {
            //you are good to go
            return true;
        }
    }
}

フォームは次のようになります。

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>

9
addEventListener他の開発者が独自のリスナーを追加できるようにするには、常にonsubmitまたはonloadの代わりに使用してください。
ベイタロフスキー2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.