我可以通过javascript将字段标记为无效吗?


92

通过阅读这篇文章,我发现对于HTML5引入了一些针对“有效”和“无效”输入值的伪类。

有没有一种方法可以从JavaScript将输入字段标记为无效/有效?还是可以替代使用的验证方法?


您总是可以使用“无效”类加倍学习,但是了解有更好的方法真的很有趣。
尖尖的

1
是的,当然,但是那会很无聊;)
Svish 2012年

1
Svish,您可以重新评估以下答案吗?看起来dajavax提供了完全符合您想要的答案。如果将dajavax的答案标记为可接受的答案,则可能对其他访问者有所帮助。
科多斯·约翰逊

@KodosJohnson当然,谢谢大家的单挑
Svish

Answers:


159

您可以为此使用customValidity函数。

如果将customValidity消息添加到该字段,它将变为无效。当您将消息设置为空字符串时,它再次变为有效(除非由于其他原因而无效)。

field.setCustomValidity("Invalid field."); 将使该字段无效。

field.setCustomValidity(""); 除非该字段无法通过HTML5约束,否则它将使该字段有效。



4
另外,如果您希望浏览器的有效性消息显示在屏幕上,input或者blur可以在此之后立即使用field.reportValidity()
山姆·卡尔顿

4

编辑:有人澄清说,您正在寻找DOM的“有效”“无效”属性。

我会使用将属性添加到每个标签dom_object.setAttribute("isvalid", "true")。您还可以具有中央验证功能,该功能可以每次(并dom_object.getAttribute("isvalid")每次使用)更新这些属性。

每当元素失去焦点时,或您需要时,都可以运行此功能。

不太优雅,但是很不幸,现在javascript和HTML5没有“伪”支持。


如果我理解您的问题,则可以使用Javascript进行验证。但是,请注意,绕过客户端验证(尤其是javascript验证)非常容易。您永远不应信任客户端数据,而应始终在服务器端进行检查。

例如,我可以通过检查源代码轻松找到元素ID,然后document.getElementById('some_id').setAttribute('max', new_number)更改最大值(这是您链接中的条目之一)。

有多种方法可以做到,所以我将尝试为您提供一般的成语。

您可以通过执行操作来获取值document.getElementById('form_element_id').value(确保您提供一个name发送到服务器的表单,以及一个id由javascript使用的表单)。对于文本区域,可以使用.innerHTML

然后,将值包含在变量中,可以通过多种方法进行检查。

例如,您可以这样做if (parseInt(my_value) < 0) //error。您也可以使用正则表达式,我不会全部解释,但是您可以从http://www.w3schools.com/jsref/jsref_obj_regexp.asp开始。我知道w3schools并不是最好的资源,但我认为这是一个不错的起点。

现在进入验证部分:添加onsubmit="return validateForm()到表单标签中,validateForm()是执行所有检查的函数。并且该函数仅true在有效时返回,false否则返回。这将覆盖默认的验证功能(默认情况下不执行任何操作)。

因此,在上述示例中,//error将被替换为return false。您也可以做其他事情;例如警告错误,然后返回false。您还可以使用javascript突出显示无效字段(不确定这是否是“从javascript中将输入字段标记为无效/有效”)。

当然,如果您不想检查所有字段,则仅在某些字段通过时才返回true。同样,您不应该依赖于此,但是如果您只是为了阻止普通民众,那么这是一个简单的解决方案。


8
您是完全正确的,但我认为您不完全理解这个问题。在HTML5中,有多种方法可以将属性值添加到HTML标记中,这暗示着内置的验证规则。当浏览器应用这些规则时,输入字段将匹配CSS中的“:valid”或“:invalid”伪类。因此,您可以编写具有这些属性的HTML,并编写带有规则的“:valid”和“:invalid”选择器的CSS,并提供视觉反馈,而无需任何JavaScript。问题是,基本上是否可以将“:valid”状态用作DOM属性。
尖尖的

-17

有没有一种方法可以从JavaScript将输入字段标记为无效/有效?

不幸的是,您无法在JavaScript中设置伪类的样式,因为它们不是真正的元素,因此在实际的DOM中不存在。

使用香草JavaScript时,您将使用验证API

在jQuery中,您可以简单地做到这一点,http://jsfiddle.net/elclanrs/Kak6S/

if ( $input.is(':invalid') ) { ... }

还是可以替代使用的验证方法?

如果您使用的是HTML5验证,请坚持使用标记。否则,您可以使用禁用HTML5验证$form.attr('novalidate', 'novalidate')并使用JS来验证您的字段,然后在需要时添加validinvalid类。我做了一个可以像这样的插件来支持非HTML5浏览器。


你是什​​么意思,你不能称呼他们?我已经在做 input:invalid + label::after{content: " INVALID";color: red;}如果该字段无效(例如,如果某个电子邮件字段中包含无效的电子邮件),则在该输入字段旁边的标签之后添加一个红色的INVALID文本,该字段无效
Svish 2012年

11
“是否可以通过javascript将输入字段标记为无效/有效?” “不幸的是,您无法从JavaScript中设置伪类的样式”这不是问题所在。
mikemaccana 2015年

您应该能够使用CSSOM动态地通过伪类定义一个新类……
Brett Zamir
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.