禁用HTML5表单元素的验证


418

例如,在我的表单中,我想使用新的HTML5表单类型<input type="url" />有关此类型的更多信息)。

问题是Chrome希望对我有帮助,并为我验证这些元素,除了它会吸引人。如果未通过内置验证,则该元素不会成为焦点。我用预先填充了URL元素"http://",因此我自己的自定义验证只是将这些值视为空字符串,但Chrome拒绝了。如果我可以更改其验证规则,那也可以。

我知道我可以恢复使用,type="text"但是我希望使用这些新类型的产品提供更好的增强功能(例如:它会自动切换到移动设备上的自定义键盘布局):

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


8
HTML 5.1规范草案中提到了一个inputmode属性,如果我理解正确的话,该属性可用于指定当用户与该字段进行交互时应向用户提供哪种键盘类型,而无需暗示任何验证规则。在将来的某个时候,使用inputmode属性代替type属性可能是解决此问题的正确方法-但目前还不是。
Mark Amery 2013年

@MarkAmery尽管现在获得未来并不难:$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Marnen Laibow-Koser 2014年

1
@ MarnenLaibow-Koser如果您要做的只是关闭验证(如问题询问者所指定),那么您描述的内容将起作用,但并不能达到相同的结果inputmode。以您的方式进行操作,您仍然无法(例如)读取用户在type输入框中输入的非数字值number。例如,尝试在此小提琴的文本框中键入非数字内容,然后单击按钮。
Mark Amery 2014年

@MarkAmery有趣。那是因为<input type='number'>根本不接受非数字值吗?
Marnen Laibow-Koser 2014年

@ MarnenLaibow-Koser我想是的。关于这个问题的有关问题的公认答案包括一个链接,该链接指向回答者声称强制执行此行为的规范。
Mark Amery 2014年

Answers:


752

如果要禁用HTML5中表单的客户端验证,请向表单元素添加novalidate属性。例如:

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

参见https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidate


83
novalidate="novalidate"并且novalidate=""也是有效的语法。
bassim'5

9
@bassim有效的语法,但过于冗长-为什么键入的文字超出您的需要?
user1569050 2013年

11
@ user1569050例如在CakePHP之类的框架中,novalidate="novalidate"当您novalidate => true在的$options数组中设置时,它将使用该方法FormHelper::create()。感谢bassim提供的额外信息:)
Jelmer 2013年

12
@ rybo111这是客户端验证,可以减少对服务器的请求数量。这不是放松服务器端验证的借口。
martti

11
@martti我指的是以下事实:如果我正在测试一些新的PHP验证,则可以快速禁用该表单的JavaScript验证,以避免必须正确填写整个表单。我应该写“更容易测试”。
rybo111 2014年

31

我阅读了规范并在Chrome中进行了一些测试,如果您发现“无效”事件并返回false,则似乎可以提交表单。

我正在使用带有此HTML的jquery。

// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
  alert('invalid');
  return false;
});

document.forms[0].onsubmit = function () {
  alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type="url" value="http://" />
  <button type="submit">Submit</button>
</form>

我没有在任何其他浏览器中对此进行过测试。


太好了-明天我会尝试一下,让您知道它的进展。谢谢。
尼克

哇!我当时很难看提交事件的去向。谢谢你,先生!
吉普赛国王

2
FireFox正在验证输入的更改。然后不会触发“无效”事件。因此,对我来说没有解决方案。
Niels Steenbeek 2012年

7
明天永远不会来:)
Lucky Soni 2014年

4
不起作用 我已经将代码片段化了。捕获invalid事件并返回false不会让表单提交。
Dan Dascalescu 2015年

23

我只是想补充一点,在表单中使用novalidate属性只会阻止浏览器发送表单。浏览器仍然评估数据并添加:valid和:invalid伪类。

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


这些条目叫什么?
tm_forthefuture 2014年

1
哈哈-我不知道再对不起。这是3年前了。:(
BFTrick

1
您的意思是:<form action="" method="" class="" id="" novalidate>;)
穆罕默德·沙赫扎德

15

最好的解决方案是使用文本输入并添加属性inputmode =“ url”以提供URL键盘功能。HTML5规范被认为是用于此目的的。如果保留type =“ url”,则将获得语法验证,该语法验证在每种情况下都没有用(最好检查它是否返回404错误,而不是相当宽松的语法,并且没有太大帮助)。

您还可以使用属性pattern =“ https?://.+”覆盖默认模式,例如,使其更具宽松性。

将novalidate属性放在表单中不是对所提问题的正确答案,因为它删除了表单中所有字段的验证,例如,您可能希望保留对电子邮件字段的验证。

使用jQuery禁用验证也是一个不好的解决方案,因为它在没有JavaScript的情况下绝对可以工作。

就我而言,我在URL输入之前放置了带有2个选项(http://或https://)的select元素,因为我只需要网站(而不需要ftp://或其他东西)。这样,我避免输入这个奇怪的前缀(Tim Berners-Lee的最大遗憾,也许是URL语法错误的主要来源),并且我使用带有占位符(无HTTP)的带有inputmode =“ url”的简单文本输入。我使用jQuery和服务器端脚本来验证网站的真实存在(无404),并删除HTTP前缀(如果插入)(我避免使用类似pattern =“ ^((?http)。** $”的模式)以防止放置前缀,因为我认为最好放宽一些)


13

您可以将http://in用作占位符文本,而不必尝试绕过浏览器的验证进行最终处理。这是从您链接的页面开始的:

占位符文字

HTML5给Web表单带来的第一个改进是可以在输入字段中设置占位符文本的功能。只要该字段为空且未聚焦,便会在输入字段内显示占位符文本。单击输入字段(或使用Tab键选择)后,占位符文本即消失。

您以前可能已经看过占位符文本。例如,Mozilla Firefox 3.5现在在位置栏中包含占位符文本,显示为“搜索书签和历史记录”:

在此处输入图片说明

当您单击(或选项卡到)位置栏时,占位符文本消失:

在此处输入图片说明

具有讽刺意味的是,Firefox 3.5不支持将占位符文本添加到您自己的Web表单中。这就是生活。

占位符支持

IE  FIREFOX SAFARI  CHROME  OPERA   IPHONE  ANDROID
·   3.7+    4.0+    4.0+    ·       ·       ·

您可以在自己的网络表单中添加占位符文本的方法如下:

<form>
  <input name="q" placeholder="Search Bookmarks and History">
  <input type="submit" value="Search">
</form>

不支持该placeholder属性的浏览器只会忽略它。没有伤害,没有犯规。查看您的浏览器是否支持占位符文本

不会完全一样,因为它不会为用户提供“起点”,但至少在一半位置。


5
+1是小费,但不幸的是,这对我来说不是解决方案。我仍然不希望进行任何验证,主要是因为它的UX非常差。
尼克

10

我在下面的选择器中找到了带有CSS的Chrome解决方案,而没有绕过本机验证表单,这可能会非常有用。

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


1
这在最新版的chrome(29)中不起作用,我想知道是否是因为眨眼
Blowsie 2013年

5

只需在表单中使用novalidate即可

<form name="myForm" role="form" novalidate class="form-horizontal" ng-hide="formMain">

干杯!!!


1
禁用单个输入标签的验证怎么办?
Tobias Kolb

0

这是我用来防止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;
});

0

您可以添加一些JavaScript来消除那些令人讨厌的验证气泡,并添加自己的验证器。

document.addEventListener('invalid', (function(){
    return function(e) {
      //prevent the browser from showing default error bubble / hint
      e.preventDefault();
      // optionally fire off some custom validation handler
      // myValidation();
    };
})(), true);

0

如果将表单元素标记为required=""novalidate=""无济于事。

规避required验证的一种方法是禁用元素


-5

您可以安装简单的chrome扩展程序,并即时禁用https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related的验证

默认情况下,所有内容都将默认运行,但是您可以通过单击工具栏上的扩展图标来禁用html5验证


不确定为什么很多人不喜欢此解决方案,它允许测试HTML5表单的服务器验证而无需编写实际的HTML代码
Andrew

3
我认为它是不受欢迎的,因为问题集中在构建 HTML5表单并关闭所有用户的自动验证上。要求所有用户A)使用Chrome浏览器和B)在使用您的网站之前安装扩展程序不是一个可行的解决方案。
Kallmanation
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.