如何在javascript中监听表单提交事件?


124

我想编写自己的表单验证javascript库,并且一直在google上寻找如何检测是否单击了提交按钮,但是我发现的只是代码,您必须onSubmit="function()"在html中使用onClick on 。

我想制作此javascript,以便不必触摸任何html代码,例如添加onSubmit或onClick javascript。


8
为什么不document.forms['yourForm'].onsubmit = function(){}呢?还是addEventListener
约瑟夫·西尔伯

3
您是否真的要检查是否单击了“提交”按钮,还是要检查用户何时提交表单(可以通过单击按钮或通过从任一字段中按Enter来完成)?
nnnnnn

Answers:


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用库事件

如果出于某种原因您决定需要一个库(您已经在使用一个库,或者不想处理跨浏览器的问题),则可以使用以下方法在普通库中侦听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提供的必需功能,而jQuery也必须也是“可怕的...丑陋”代码。
RobG 2011年

45
我对jQuery没有太多反对,只有反对将jQuery用作魔术的人才意识到,他们可以用几行代码代替整个东西。为什么不花时间去了解浏览器的实际工作方式呢?其实并不难。
RobG 2011年

4
@Ben-仅仅因为您可以对某个库做某事并不意味着您也应该这样做,也不应因“仅使用库x”的回答而劝阻其他人学习基础知识。当有人问有关javascript的特定问题时,礼貌地使用普通javascript回答问题。一定要从您选择的库中提出一些建议,但是回答问题应该是第一要务。
RobG 2011年

4
我个人认为,一个人应该首先了解基础知识。
德里克·朕会功夫

7
本着同样的精神,我们确实应该尝试编写更多的汇编语言。开个玩笑(我很喜欢一个jQuery解决方案,如果您真的想了解引擎盖下发生的事情,我认为这是一个无尽的麻烦),但是,是的,我很高兴我知道一些汇编语言,并且知道如何使用TCP建立连接等等。我仍然不会向任何人提供较低级别的解决方案,只是为了向他们传授高级知识。
Josh Sutterfield '16

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来允许其他开发人员添加自己的侦听器。
beytarovski

0

使用jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.