HTML5 表单必需属性。设置自定义验证消息?

IT技术 javascript html forms validation
2021-01-24 08:02:13

我有以下 HTML5 表单:http : //jsfiddle.net/nfgfP/

<form id="form" onsubmit="return(login())">
<input name="username" placeholder="Username" required />
<input name="pass"  type="password" placeholder="Password" required/>
<br/>Remember me: <input type="checkbox" name="remember" value="true" /><br/>
<input type="submit" name="submit" value="Log In"/>

目前,当我在它们都为空白时按 Enter 键时,会出现一个弹出框,上面写着“请填写此字段”。如何将该默认消息更改为“此字段不能为空”?

编辑:另请注意,类型密码字段的错误消息很简单*****要重新创建它,请给用户名一个值并点击提交。

编辑:我使用 Chrome 10 进行测试。请做同样的事

6个回答

这是在 HTML5 中处理自定义错误消息的代码:

<input type="text" id="username" required placeholder="Enter Name"
  oninvalid="this.setCustomValidity('Enter User Name Here')"
  oninput="this.setCustomValidity('')"/>

这部分很重要,因为它隐藏了用户输入新数据时的错误信息:

oninput="this.setCustomValidity('')"
感谢您将 oninput="setCustomValidity('')" 标记为最重要。这挽救了我的一天。
2021-03-16 08:02:13
到目前为止,在 FF 38 中是完美的。修复了仅使用 oninvalid() 时电子邮件验证中的错误。
2021-03-20 08:02:13
@somnath-kadam 这是一个错误还是你故意做 oninput="setCustomValidity('')" 而不是 oninput="this.setCustomValidity('')"
2021-03-24 08:02:13
在 Firefox 29.0 和 Chrome 34.0.1847.137 上完美运行。
2021-03-26 08:02:13
请注意,this.在这种情况下您甚至可以省略 ,因为内联事件处理程序使用 awith(this)(不是说您应该)运行
2021-04-04 08:02:13

使用setCustomValidity

document.addEventListener("DOMContentLoaded", function() {
    var elements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("This field cannot be left blank");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})

按照@itpastorn在评论中的建议从 Mootools更改为 vanilla JavaScript,但如果需要,您应该能够计算出等效的 Mootools。

编辑

我在这里更新了代码,因为它的setCustomValidity工作原理与我最初回答时的理解略有不同。如果setCustomValidity设置为空字符串以外的任何内容,则会导致该字段被视为无效;因此在测试有效性之前必须清除它,您不能设置它并忘记它。

进一步编辑

正如下面@thomasvdb 的评论中所指出的,您需要在某些事件之外清除自定义有效性,invalid否则可能需要额外通过oninvalid处理程序来清除它。

这确实是解决方案。通过@hleinone 的解决方案找到了它。感谢您的回复!
2021-03-17 08:02:13
我试过了,但仍然有错误。如果您将该字段留空,它会显示消息,然后在该字段中输入一些内容,但现在它会显示一条空消息,并且不会执行该操作。如果您现在再次单击该按钮,它将通过。
2021-03-18 08:02:13
@thomasvdb 尝试在input事件中将自定义有效性设置为空字符串目前只有在invalid事件被触发时才会被清除
2021-03-27 08:02:13
@Lai32290 因为您没有访问实际的 DOM 对象。$("")返回一组对象,即使只有一个。$("")[i]很可能是你想要的。
2021-04-06 08:02:13
上面的解决方案只使用JQuery来等待文档加载。其他一切都是纯 JS 和 DOM。一个足够现代以支持 setCustomValidity 的浏览器也应该支持 DOMContentLoaded 事件,这意味着不需要 JQuery,如果它不用于其他任何事情。
2021-04-08 08:02:13

借助HTML5事件控制自定义消息非常简单oninvalid

这是代码:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')"
       onvalid="this.setCustomValidity('')">

这是最重要的:

onvalid="this.setCustomValidity('')"
这会导致 firefox 中的一个错误,它在刷新时验证,但在更改和更正时失败。
2021-03-21 08:02:13
@RyanCharmley 使用onchange="this.setCustomValidity('')"该错误将消失。在下面检查我的答案。
2021-03-25 08:02:13
还要检查其他验证,例如模式、最小/最大值等... sanalksankar.blogspot.com/2010/12 /...
2021-03-27 08:02:13
如果这不起作用(它没有在Safari浏览器,例如),使用oninput代替onvalid
2021-03-29 08:02:13
@Jimothy 是对的,oninput是更通用的解决方案,onvalid即使在 Chrome 中对我来说也不起作用。
2021-04-04 08:02:13

注意:这在 Chrome 中不再有效,未在其他浏览器中测试。请参阅下面的编辑。这个答案留在这里以供历史参考。

如果您觉得验证字符串真的不应该由代码设置,您可以将输入元素的标题属性设置为“此字段不能留空”。(适用于 Chrome 10)

title="This field should not be left blank."

http://jsfiddle.net/kaleb/nfgfP/8/

在 Firefox 中,您可以添加此属性:

x-moz-errormessage="This field should not be left blank."

编辑

自从我最初写这个答案以来,这似乎已经改变了。现在添加标题不会更改有效性消息,它只是向消息添加附录。上面的小提琴仍然适用。

编辑 2

从 Chrome 51 开始,Chrome 现在对 title 属性不做任何处理。我不确定在哪个版本中发生了变化。

对于 Firefox 中的声明性错误消息,请使用以下属性: x-moz-errormessage="This field should not be left blank."
2021-03-20 08:02:13
这不会更改实际的消息内容。
2021-03-24 08:02:13
这会在“请填写此字段”下添加一条描述性消息。
2021-03-27 08:02:13
我的错误,OP 指定了 Chrome 10,我在 FF5 上。删除了downvote,我很抱歉。哇,Chrome 中的错误消息是我见过最丑陋的东西。
2021-03-31 08:02:13
在我测试它的时候。
2021-04-03 08:02:13

借助HTML5 oninvalid事件控制自定义消息非常简单

这是代码:

User ID 
<input id="UserID"  type="text" required 
       oninvalid="this.setCustomValidity('User ID is a must')">
一旦控件接收到输入,则需要将有效性消息设置为空白,否则将针对所有字段显示第一次执行的有效性消息。每当调用 setCustomValidity() 时添加 oninput="setCustomValidity('')"。+1 对 Somnath 的回答。
2021-03-15 08:02:13