在我的表单中,我想使用新的HTML表单类型,例如<input type="url" />(关于类型的更多信息在这里)。

问题是Chrome想要超级有用,并验证这些元素为我,除了它在这方面很糟糕。如果它没有通过内置验证,除了元素获得焦点之外,没有其他消息或指示。我用“http://”预填充URL元素,所以我自己的自定义验证只是将这些值视为空字符串,但Chrome拒绝了这一点。如果我能改变它的验证规则,那也可以。

我知道我可以回到使用type="text",但我想使用这些新类型提供的很好的增强(例如:它自动切换到移动设备上的自定义键盘布局):

有没有办法关闭或自定义自动验证?


当前回答

如果你将一个表单元素标记为required=""那么novalidate=""没有帮助。

绕过必需的验证的一种方法是禁用元素。

其他回答

我找到了一个解决方案,Chrome与CSS这个下面的选择器没有绕过本机验证形式,这可能是非常有用的。

form input::-webkit-validation-bubble-message, 
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
    display:none;
} 

通过这种方式,你还可以自定义你的消息…

我在这一页上找到了解决方案: http://trac.webkit.org/wiki/Styling%20Form%20Controls

下面是我用来防止chrome和opera显示无效输入对话框的函数,即使使用novalidate。

window.submittingForm = false;
$('input[novalidate]').bind('invalid', function(e) {
    if(!window.submittingForm){
        window.submittingForm = true;
        $(e.target.form).submit();
        setTimeout(function(){window.submittingForm = false;}, 100);
    }
    e.preventDefault();
    return false;
});

如果你将一个表单元素标记为required=""那么novalidate=""没有帮助。

绕过必需的验证的一种方法是禁用元素。

在JSX (JavaScript, React, Angular, Vue等)中,你需要在表单中添加noValidate(驼峰大写V是必要的):

<form onSubmit={handleSubmit(data)} noValidate>

正如Jakob S所说,在纯HTML的情况下,添加novalidate到表单元素:

<form method="post" action="/foo" novalidate>...</form>

我只是想添加,在你的表单中使用novalidate属性只会阻止浏览器发送表单。浏览器仍然计算数据并添加:valid和:invalid伪类。

我发现这一点是因为有效和无效的伪类是我一直在使用的HTML5样板样式表的一部分。我只是删除了CSS文件中与伪类相关的条目。如果有人找到了其他解决方案,请告诉我。