Як я можу слухати подію подання форми у javascript?


124

Я хочу написати власну бібліотеку JavaScript для перевірки форми, і я шукав у Google, як визначити, чи натиснути кнопку подання, але все, що я знайшов, - це код, у якому вам потрібно використовувати onClick on onSubmit="function()"у HTML.

Я хотів би зробити цей javascript, щоб мені не доводилося торкатися жодного html-коду, наприклад, додавання onSubmit або onClick javascript.


8
Чому ні document.forms['yourForm'].onsubmit = function(){}? Або addEventListener?
Джозеф Сільбер

3
Ви дійсно хочете перевірити, чи натиснути кнопку надсилання, чи ви хочете перевірити, коли користувач подає форму (що може зробити, натиснувши кнопку або натиснувши Enter з одного з полів)?
nnnnnn

Відповіді:


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.addEventListener, ознайомтеся з цією документацією на MDN .

Щоб скасувати нативну 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. КутовийJS (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 рядків коду "притворно ... потворно" замінюють необхідну функціональність, надану 4000 рядками jQuery, який також повинен бути "притворним ... потворним" кодом.
RobG

45
Я не дуже проти jQuery, лише ті, хто використовує це як своєрідний магічний заклик, не розуміючи, що вони можуть замінити всю річ кількома рядками коду. Чому б не витратити час, щоб дізнатися, як насправді працюють браузери? Це насправді не так складно.
RobG

4
@Ben - і те, що ти можеш щось зробити з бібліотекою, не означає, що ти також не повинен також відмовлятись від вивчення основ відповідями "просто використовувати бібліотеку x". Коли хтось задає конкретне запитання щодо javascript, ввічливо відповідати на це питання, використовуючи звичайний javascript. Очевидно, пропонуйте щось із вибраної вами бібліотеки, але відповідь на це питання має бути першочерговим завданням.
RobG

4
Я особисто вважаю, що людина спочатку повинна знати основи.
Дерек 朕 會 功夫

7
в такому ж дусі, ми дійсно повинні спробувати написати більше асемблерської мови. Напівжарт (я дуже віддаю перевагу рішення jquery і думаю, що це нескінченна кроляча дірка, якщо ви дійсно хочете зрозуміти, що відбувається під кришкою), але так, я радий, що я знаю якусь мову монтажу і знаю, як TCP з'єднання зроблені і т. д. Я все одно не дав би комусь рішення нижчого рівня лише заради того, щоб навчити їх чудесам того, що є під кришкою.
Джош Саттерфілд

6

Це найпростіший спосіб ви можете викликати власну функцію javascript при виникненні onSubmit.

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
Чому ви вирішили пов'язувати функцію "подання"? У функції не використовується "це".
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, щоб дозволити іншим розробникам додавати власних слухачів.
бейтаровські

0

За допомогою jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.