Как я могу прослушать событие отправки формы в javascript?

124

Я хочу написать свою собственную библиотеку javascript для проверки формы, и я искал в Google, как определить, нажата ли кнопка отправки, но все, что я нашел, - это код, в котором вы должны использовать onClick on onSubmit="function()"в html.

Я хотел бы сделать этот javascript, чтобы мне не приходилось трогать какой-либо html-код, например, добавлять javascript onSubmit или onClick.

ed1t
источник
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. 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 строк «ужасного ... уродливого» кода заменяют требуемую функциональность, предоставляемую 4000 строками jQuery, который также должен быть «ужасным ... уродливым» кодом.
RobG
45
Я не имею ничего против jQuery, только тех, кто использует его как своего рода магическое заклинание, не понимая, что они могут заменить все это несколькими строчками кода. Почему бы не найти время, чтобы узнать, как на самом деле работают браузеры? Это действительно не так уж и сложно.
RobG
4
@Ben - и то, что вы можете что-то делать с библиотекой, не означает, что вы тоже должны это делать, и других не следует отговаривать от изучения основ, отвечая «просто используйте библиотеку x». Когда кто-то задает конкретный вопрос о javascript, вежливо ответить на него, используя простой javascript. Обязательно предложите что-нибудь из вашей библиотеки по выбору, но ответ на вопрос должен быть в первую очередь.
RobG
4
Я лично считаю, что человек должен сначала знать основы.
Derek 朕 會 功夫
7
в том же духе нам действительно стоит попробовать писать больше на ассемблере. Полушутя (я предпочитаю решение jquery и думаю, что это бесконечная кроличья нора, если вы действительно хотите понять, что происходит под капотом), но да, я рад, что я ДЕЙСТВИТЕЛЬНО знаю некоторый язык ассемблера и знаю, как TCP устанавливаются связи и т. д. Я все равно не стал бы передавать кому-либо решение более низкого уровня только ради того, чтобы научить их чудесам того, что находится под капотом.
Джош Саттерфилд 08
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
Почему вы решили привязать "отправленную" функцию? В функции нет использования слова this.
Лиор
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>
fakedob
источник
9
всегда используйте addEventListenerвместо onsubmit или onload, чтобы другие разработчики могли добавлять своих слушателей.
beytarovski
0

С jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Justin808
источник