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

ed1*_*d1t 115 javascript forms validation

我想写自己的表单验证javascript库,我一直在谷歌上查看如何检测是否点击了提交按钮,但我找到的只是代码,你必须onSubmit="function()"在html中使用onClick .

我想制作这个javascript,以便我不必触摸任何HTML代码,如添加onSubmit或onClick javascript.

Der*_*會功夫 479

为什么人们总是在没有必要时使用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
}
Run Code Online (Sandbox Code Playgroud)

callback 是在提交表单时要调用的函数.

关于EventTarget.addEventListener,请查看MDN上的此文档.

要取消本机submit事件(阻止提交表单),请.preventDefault()在回调函数中使用,

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

submit用图书馆听取活动

如果由于某种原因你已经决定了一个库是必要的(你已经使用了一个或者你不想处理跨浏览器的问题),这里有一个方法列表来监听公共库中的提交事件:

  1. jQuery的

    $(ele).submit(callback);
    
    Run Code Online (Sandbox Code Playgroud)

    ele表单元素引用在哪里,并且callback是回调函数引用.参考

    <iframe width="100%" height="100%" src="http://jsfiddle.net/DerekL/wnbo1hq0/show" frameborder="0"></iframe>
Run Code Online (Sandbox Code Playgroud)

  1. AngularJS(1.x)

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

    非常简单,控制器$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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    只需将处理程序传递给onSubmit道具.参考

  3. 其他框架/库

    请参阅框架的文档.


验证

您始终可以在JavaScript中进行验证,但使用HTML5我们也可以进行本机验证.

<!-- Must be a 5 digit number -->
<input type="number" required pattern="\d{5}">
Run Code Online (Sandbox Code Playgroud)

你甚至不需要任何JavaScript!每当不支持本机验证时,您都可以回退到JavaScript验证程序.

演示:http://jsfiddle.net/DerekL/L23wmo1L/

  • 5行"可怕......丑陋"代码取代了4,000行jQuery所提供的功能,这些代码也必须是"可怕......丑陋"的代码. (103认同)
  • 我没有太多反对jQuery,只有那些使用它作为一种神奇的咒语而没有意识到他们可以用几行代码替换整个事物.为什么不花时间了解浏览器的实际工作方式?这真的不是那么难. (45认同)
  • 本着同样的精神,我们真的应该尝试编写更多的汇编语言.半开玩笑(我更喜欢jquery解决方案,如果你真的想要了解幕后发生的事情,我认为这是一个无尽的兔子洞),但是,我很高兴我知道一些汇编语言,并且知道如何TCP连接已经完成等等.我仍然不会把任何人提到一个较低级别的解决方案,只是为了教他们什么是底层的奇迹. (6认同)
  • @Ben - 只是因为你可以用库做某事并不意味着你也应该,也不应该通过回答"只使用库x"来阻止其他人学习基础知识.当有人问一个关于javascript的特定问题时,使用普通的javascript回答这个问题很有礼貌.无论如何都要从您选择的图书馆中提出建议,但回答这个问题应该是第一要务. (4认同)
  • 我个人认为一个人应该首先了解基础知识. (4认同)
  • 如果您需要并且已经在项目中使用了jQuery,为什么不使用它呢?否则,使用JS (3认同)

Der*_*son 6

这是onSubmit发生事件时调用自己的javascript函数的最简单方法。

的HTML

<form>
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

的JavaScript

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

function submitted(event) {
    event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)

  • 您为什么决定绑定“已提交”功能?函数中没有使用“ this”。 (2认同)

Jus*_*808 -1

使用 jQuery:

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

    if (pass)
        return true;
    else
        return false;
});
Run Code Online (Sandbox Code Playgroud)