我有以下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"/>
目前当我在空白时点击输入时,会出现一个弹出框,上面写着“请填写此字段”。如何将该默认消息更改为“此字段不能留空”?
编辑:另请注意,类型密码字段的错误消息只是*****
。要重新创建此项,请为用户名提供值并点击提交。
编辑:我正在使用Chrome 10进行测试。请做同样的
答案 0 :(得分:229)
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("");
};
}
})
来自Mootools的changed to vanilla JavaScript @itpastorn在评论中提出,但如果有必要,您应该能够计算Mootools等效项。
我在这里更新了代码,因为setCustomValidity
与我最初回答的内容略有不同。如果将setCustomValidity
设置为空字符串以外的任何值,则会导致该字段被视为无效;因此,你必须在测试有效性之前清除它,你不能只是设置并忘记它。
正如@ thomasvdb在下面的评论中指出的那样,您需要在invalid
之外的某些事件中清除自定义有效性,否则可能需要额外通过oninvalid
处理程序来清除它。
答案 1 :(得分:209)
以下是处理HTML5中的自定义错误消息的代码
<input type="text" id="username" required placeholder="Enter Name"
oninvalid="this.setCustomValidity('Enter User Name Here')"
oninput="this.setCustomValidity('')" />
这一部分非常重要,因为它会在用户输入新数据时隐藏错误消息:
oninput="this.setCustomValidity('')"
答案 2 :(得分:89)
借助HTML5
事件oninvalid
这是代码:
<input id="UserID" type="text" required="required"
oninvalid="this.setCustomValidity('Witinnovation')"
onvalid="this.setCustomValidity('')">
这是最重要的:
onvalid="this.setCustomValidity('')"
答案 3 :(得分:66)
注意:此功能不再适用于Chrome,未在其他浏览器中测试过。请参阅下面的编辑。这个答案留待这里作为历史参考。
如果您觉得验证字符串确实不应该由代码设置,您可以将输入元素的title属性设置为“此字段不能留空”。 (适用于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."
自从我最初写这个答案以来,这似乎已经改变了。现在添加标题不会更改有效性消息,它只是添加了消息的附录。上面的小提琴仍然适用。
从Chrome 51开始,Chrome现在对title属性不执行任何操作。我不确定此更改的版本。
答案 4 :(得分:36)
我创建了一个小型库来简化更改和翻译错误消息。您甚至可以使用Chrome中的title
或Firefox中的x-moz-errormessage
按错误类型更改文本。转到check it out on GitHub,并提供反馈。
它的使用方式如下:
<input type="email" required data-errormessage-value-missing="Please input something">
答案 5 :(得分:35)
借助HTML5
oninvalid
事件来控制自定义消息非常简单
以下是代码:
User ID
<input id="UserID" type="text" required
oninvalid="this.setCustomValidity('User ID is a must')">
答案 6 :(得分:35)
通过在正确的时间设置和取消设置setCustomValidity
,验证消息将完美无缺。
<input name="Username" required
oninvalid="this.setCustomValidity('Username cannot be empty.')"
onchange="this.setCustomValidity('')" type="text" />
我使用的是onchange
而不是oninput
,这更加通用,即使通过JavaScript在任何条件下更改值也会发生。
答案 7 :(得分:21)
尝试这个,它更好并经过测试:
<强> HTML:强>
<form id="myform">
<input id="email"
oninvalid="InvalidMsg(this);"
oninput="InvalidMsg(this);"
name="email"
type="email"
required="required" />
<input type="submit" />
</form>
<强> JAVASCRIPT:强>
function InvalidMsg(textbox) {
if (textbox.value === '') {
textbox.setCustomValidity('Required email address');
} else if (textbox.validity.typeMismatch){
textbox.setCustomValidity('please enter a valid email address');
} else {
textbox.setCustomValidity('');
}
return true;
}
<强>演示:强>
答案 8 :(得分:10)
我发现最简单,最干净的方法是使用数据属性来存储自定义错误。测试节点的有效性并使用一些自定义html处理错误。
le javascript
if(node.validity.patternMismatch)
{
message = node.dataset.patternError;
}
和一些超级HTML5
<input type="text" id="city" name="city" data-pattern-error="Please use only letters for your city." pattern="[A-z ']*" required>
答案 9 :(得分:2)
我有一个更简单的vanilla js解决方案:
对于复选框:
document.getElementById("id").oninvalid = function () {
this.setCustomValidity(this.checked ? '' : 'My message');
};
输入:
document.getElementById("id").oninvalid = function () {
this.setCustomValidity(this.value ? '' : 'My message');
};
答案 10 :(得分:1)
好的,oninvalid效果很好,但是即使用户输入了有效数据,它也会显示错误。所以我在下面用它来解决它,希望它也对您有用,
oninvalid="this.setCustomValidity('Your custom message.')"
onkeyup="setCustomValidity('')"
答案 11 :(得分:1)
防止在输入每个符号时出现Google Chrome错误消息的解决方案:
<p>Click the 'Submit' button with empty input field and you will see the custom error message. Then put "-" sign in the same input field.</p>
<form method="post" action="#">
<label for="text_number_1">Here you will see browser's error validation message on input:</label><br>
<input id="test_number_1" type="number" min="0" required="true"
oninput="this.setCustomValidity('')"
oninvalid="this.setCustomValidity('This is my custom message.')"/>
<input type="submit"/>
</form>
<form method="post" action="#">
<p></p>
<label for="text_number_1">Here you will see no error messages on input:</label><br>
<input id="test_number_2" type="number" min="0" required="true"
oninput="(function(e){e.setCustomValidity(''); return !e.validity.valid && e.setCustomValidity(' ')})(this)"
oninvalid="this.setCustomValidity('This is my custom message.')"/>
<input type="submit"/>
</form>
答案 12 :(得分:0)
调整Salar对JSX和React的回答,我注意到React Select的行为与tokenType
字段的行为不同。显然,需要一些变通方法来显示自定义消息,并防止它在不方便的时候显示。
我提出了一个问题here,如果有任何帮助的话。 Here是一个带有工作示例的CodeSandbox,其中最重要的代码在此处转载:
Hello.js
<input/>
SelectValid.js
import React, { Component } from "react";
import SelectValid from "./SelectValid";
export default class Hello extends Component {
render() {
return (
<form>
<SelectValid placeholder="this one is optional" />
<SelectValid placeholder="this one is required" required />
<input
required
defaultValue="foo"
onChange={e => e.target.setCustomValidity("")}
onInvalid={e => e.target.setCustomValidity("foo")}
/>
<button>button</button>
</form>
);
}
}
答案 13 :(得分:0)
只需在字段中加上“ title”即可轻松处理:
<input type="text" id="username" required title="This field can not be empty" />