我有以下HTML5形式:http://jsfiddle.net/nfgfP/
<form id=“onsubmit”=“return(登录)“>
<输入=“用户名”
<输入=“pass”类型=“密码”
<br/> reminme: <输入类型=“checkbox”
<输入类型=“submit”
目前,当我点击enter时,它们都是空白的,弹出框显示“请填写此字段”。如何将默认消息更改为“此字段不能留空”?
编辑:还要注意,类型密码字段的错误消息仅仅是*****。为了重新创建这个,给用户名一个值并点击submit。
编辑:我使用Chrome 10进行测试。请也这样做
根据Salar对JSX和React的回答,我注意到React选择的行为并不像<input/>字段有关验证。显然,需要一些变通方法来只显示自定义消息,并避免在不方便的时候显示它。
我在这里提出了一个问题,如果有帮助的话。下面是一个code andbox的工作示例,其中最重要的代码复制在这里:
Hello.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>
);
}
}
SelectValid.js
import React, { Component } from "react";
import Select from "react-select";
import "react-select/dist/react-select.css";
export default class SelectValid extends Component {
render() {
this.required = !this.props.required
? false
: this.state && this.state.value ? false : true;
let inputProps = undefined;
let onInputChange = undefined;
if (this.props.required) {
inputProps = {
onInvalid: e => e.target.setCustomValidity(this.required ? "foo" : "")
};
onInputChange = value => {
this.selectComponent.input.input.setCustomValidity(
value
? ""
: this.required
? "foo"
: this.selectComponent.props.value ? "" : "foo"
);
return value;
};
}
return (
<Select
onChange={value => {
this.required = !this.props.required ? false : value ? false : true;
let state = this && this.state ? this.state : { value: null };
state.value = value;
this.setState(state);
if (this.props.onChange) {
this.props.onChange();
}
}}
value={this && this.state ? this.state.value : null}
options={[{ label: "yes", value: 1 }, { label: "no", value: 0 }]}
placeholder={this.props.placeholder}
required={this.required}
clearable
searchable
inputProps={inputProps}
ref={input => (this.selectComponent = input)}
onInputChange={onInputChange}
/>
);
}
}
使用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换成了普通的JavaScript,但如果有必要,你应该能够找到Mootools的等效版本。
Edit
我在这里更新了代码,因为setCustomValidity的工作方式与我最初回答时的理解略有不同。如果setCustomValidity被设置为空字符串以外的任何值,将导致该字段被认为无效;因此,您必须在测试有效性之前清除它,您不能只是设置它然后忘记。
进一步的编辑
正如下面@thomasvdb的评论中指出的那样,你需要在无效之外的一些事件中清除自定义有效性,否则可能会通过oninvalid处理程序来清除它。
注意:这不再工作在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."
Edit
自从我最初写下这个答案以来,这似乎已经改变了。现在添加标题并不会改变有效性消息,它只是向消息添加了一个附录。上述说法仍然适用。
编辑2
Chrome现在不做任何与标题属性的Chrome 51。我不确定这在哪个版本中发生了变化。