Javascript'teki form gönderme olayını nasıl dinleyebilirim?


124

Kendi form doğrulama javascript kitaplığımı yazmak istiyorum ve Google'da bir gönder düğmesinin tıklanıp tıklanmadığını nasıl tespit edeceğimi araştırıyorum ama bulduğum tek şey onClick on'u kullanmanız gereken kod. onSubmit="function()" .

Bu javascript'i onSubmit veya onClick javascript eklemek gibi herhangi bir html koduna dokunmak zorunda kalmamak için yapmak istiyorum.


8
Neden olmasın document.forms['yourForm'].onsubmit = function(){}? Veya addEventListener?
Joseph Silber

3
Gönder düğmesinin tıklanıp tıklanmadığını gerçekten kontrol etmek istiyor musunuz veya kullanıcının formu ne zaman gönderdiğini kontrol etmek mi istiyorsunuz (bunu düğmeyi tıklayarak veya alanlardan birinden Enter tuşuna basarak yapabilir)?
nnnnnn

Yanıtlar:


506

İnsanlar gerekli olmadığında neden her zaman jQuery kullanıyor?
İnsanlar neden basit JavaScript kullanamıyor?

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 form gönderilirken aramak istediğiniz bir işlevdir.

Hakkında EventTarget.addEventListener, MDN ile ilgili bu belgelere göz atın .

Yerel submitolayı iptal etmek için (formun gönderilmesini engellemek), .preventDefault()geri arama işlevinizde kullanın ,

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

submitEtkinliği kütüphanelerle dinlemek

Herhangi bir nedenle bir kitaplığın gerekli olduğuna karar verdiyseniz (zaten bir kitaplık kullanıyorsanız veya tarayıcılar arası sorunlarla uğraşmak istemiyorsanız), ortak kitaplıklarda gönderme olayını dinlemenin yollarının bir listesi:

  1. jQuery

    $(ele).submit(callback);

    eleForm öğesi başvurusu nerede ve callbackgeri arama işlevi başvurusu. Referans

  1. AngularJS (1.x)

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

    Çok basit, denetleyicinizin$scope içindeki çerçeve tarafından sağlanan kapsam nerede ? Referans

  2. Tepki

    <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
    }

    Sadece bir işleyiciyi onSubmitpervaneye iletin. Referans

  3. Diğer çerçeveler / kitaplıklar

    Çerçevenizin belgelerine bakın.


onaylama

Doğrulamanızı her zaman JavaScript'te yapabilirsiniz, ancak HTML5 ile yerel doğrulamaya da sahibiz.

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

JavaScript'e bile ihtiyacınız yok! Yerel doğrulama desteklenmediğinde, bir JavaScript doğrulayıcıya geri dönebilirsiniz.

Demo: http://jsfiddle.net/DerekL/L23wmo1L/


106
Bu 5 satırlık "korkunç ... çirkin" kod, 4.000 satırlık jQuery tarafından sağlanan gerekli işlevselliğin yerini alıyor ve bu da "korkunç ... çirkin" kod olmalı.
RobG

45
JQuery'ye karşı pek bir şeyim yok, sadece onu birkaç satır kodla değiştirebileceğinin farkında olmadan onu bir tür sihirli büyü olarak kullananlar. Tarayıcıların gerçekte nasıl çalıştığını öğrenmek için neden zaman ayırmayasınız? Gerçekten o kadar zor değil.
RobG

4
@Ben - ve bir kitaplıkla bir şeyler yapabildiğiniz için, sizin de yapmanız gerektiği anlamına gelmez, ne de başkalarının "sadece kitaplığı x kullan" yanıtları ile temel bilgileri öğrenmekten vazgeçmesi gerekmez. Birisi javascript hakkında belirli bir soru sorduğunda, soruyu düz javascript kullanarak cevaplamak kibarlıktır. Elbette seçtiğiniz kütüphaneden bir şeyler önerin, ancak soruyu cevaplamak birinci öncelik olmalıdır.
RobG

4
Ben şahsen bir kişinin önce temelleri bilmesi gerektiğine inanıyorum.
Derek 朕 會 功夫

7
aynı ruhla, gerçekten daha montaj dili yazmayı denemeliyiz. Yarı şaka (Ben oldukça jquery çözümünü tercih ederim ve kaputun altında neler olup bittiğini gerçekten anlamak istiyorsanız bunun sonsuz bir tavşan deliği olduğunu düşünüyorum ), ancak evet, bir montaj dili bildiğim ve TCP'nin nasıl olduğunu bildiğim için mutluyum. bağlantılar kurulur, vb. Sırf onlara kaputun altında ne harikalarını öğretmek uğruna kimseye daha düşük seviyeli bir çözüm sunmam.
Josh Sutterfield

6

Bu, bir onSubmitmeydana geldiğinde kendi javascript işlevinizin çağrılmasını sağlamanın en basit yoludur .

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
Neden 'gönderilen' işlevini bağlamaya karar verdiniz? İşlevde "bu" kullanılmaz.
Lior

bindgerçekten gereksizdir.
pstadler

3

Gereksinimlerinize bağlı olarak, jQuery gibi kitaplıklar olmadan da aşağıdakileri yapabilirsiniz:

Bunu kafana ekle:

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;
        }
    }
}

Ve formunuz yine de şunun gibi görünebilir:

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

9
addEventListenerdiğer geliştiricilerin kendi dinleyicilerini eklemelerine izin vermek için her zaman onsubmit veya onload yerine kullanın .
beytarovski

0

JQuery ile:

$('form').submit(function () {
    // Validate here

    if (pass)
        return true;
    else
        return false;
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.