使用HTML5验证时如何绑定到提交事件?

Por*_*man 10 validation jquery html5

使用HTML5验证......

在HTML5的浏览器,验证发生之前submit事件.因此,如果表单无效,则提交事件永远不会触发.

我想将一个事件挂钩到表单提交中,以触发表单是否验证.这是一个小例子,我试图alert()在用户提交表单时.

HTML:

<!DOCTYPE html>
<html>
    <head><title>Example</title></head>
    <body>
        <form>
            <input type="text" name="foo" required title="Foo field"/>
            <input type="submit"/>
        </form>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$(function() {
    $('form').submit(function() {
        alert('submit!')
    });
});
Run Code Online (Sandbox Code Playgroud)

互动演示:http://jsfiddle.net/gCBbR/

我的问题是:浏览器是否提供了一个可以绑定的替代事件,它将在验证之前运行?

Moh*_*sen 16

是的,出于这个原因有一个事件.invalid当用户在通过HTML5验证方法检查有效性时尝试提交for orr时,将调用该事件checkValidity().如果blur没有调用此事件,则不会checkValidity()因为您的input标记中包含HTML验证属性而触发此类事件.但它确实在表单提交之前触发.

来自W3C:

checkValidity(调用该方法时,如果该元素是约束验证的候选者并且不满足其约束,则用户代理必须触发一个名为invalid 可取消的简单事件(但在这种情况下没有默认操作)并返回该元素并返回假.否则,它必须只返回true而不做任何其他事情.

例如,你有这个标记:

<form>
            <input type="text" name="foo" required title="Foo field"/>
            <input type="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

然后,如果数据无效,则需要调用checkValidity()fire invalid事件 input:

document.querySelectorAll('input')[0].addEventListener('blur', function(){
        this.checkValidity();
    }, false);

document.querySelectorAll('input')[0].addEventListener('invalid', function(){
        console.log('invalid fired');
    }, false);
Run Code Online (Sandbox Code Playgroud)

看看我的例子:http://jsbin.com/eluwir/2

  • 实际上这不完全正确.使用程序化约束验证(checkValidity)*和*交互式表单验证(用户尝试提交具有无效输入的表单)触发无效事件.此外还有另外两个很大的区别,每个无效输入都会触发无效,并且只提交一次+无效事件不会冒泡到表单(您可以使用捕获...). (2认同)