Javascript 如何使浏览器自动填充值显示在序列化的React`Field`组件数据中?
我在React中构建了一个Javascript 如何使浏览器自动填充值显示在序列化的React`Field`组件数据中?,javascript,forms,autofill,reactjs,Javascript,Forms,Autofill,Reactjs,我在React中构建了一个表单组件,这个表单有一些字段组件作为子组件。我正在使用这些组件构建一个具有电子邮件地址和密码的登录表单。我的表单有一个onSubmit处理程序,它序列化它的子项(字段),并发送一个AJAX请求 在正常情况下,一切正常。但是,当像Chrome这样的浏览器使用我的电子邮件地址和密码创建表单时,序列化不会获取输入的值 字段当前看起来像这样: /** @jsx React.DOM */ var Field = React.createClass({ serialize:
表单
组件,这个表单有一些字段
组件作为子组件。我正在使用这些组件构建一个具有电子邮件地址和密码的登录表单。我的表单有一个onSubmit
处理程序,它序列化它的子项(字段),并发送一个AJAX请求
在正常情况下,一切正常。但是,当像Chrome这样的浏览器使用我的电子邮件地址和密码创建表单时,序列化不会获取输入的值
字段当前看起来像这样:
/** @jsx React.DOM */
var Field = React.createClass({
serialize: function() {
return { name: this.props.name, value: this.refs.field.state.value };
},
render: function() {
return (
<div>
<label>
{this.props.label}
<input type={this.props.type} ref="field"
name={this.props.name}
defaultValue={this.props.value} />
</label>
</div>
)
}
});
/**@jsx React.DOM*/
变量字段=React.createClass({
序列化:函数(){
返回{name:this.props.name,value:this.refs.field.state.value};
},
render:function(){
返回(
{this.props.label}
)
}
});
如何使浏览器自动填充值显示在序列化的字段中?
状态应朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,serialize
方法应该是:
serialize: function() {
return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},
状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,serialize
方法应该是:
serialize: function() {
return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},
状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,serialize
方法应该是:
serialize: function() {
return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},
状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,serialize
方法应该是:
serialize: function() {
return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},
这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点
componentDidMount () {
let tries = 4;
this.int = setInterval(() => {
tries--;
if (tries === 0) {
this._createChangeEvent();
clearInterval(this.int);
}
}, 300);
}
_createChangeEvent = () => {
if ("createEvent" in document) {
const evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
this.input.dispatchEvent(evt);
} else {
this.input.fireEvent("onchange");
}
};
这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点
componentDidMount () {
let tries = 4;
this.int = setInterval(() => {
tries--;
if (tries === 0) {
this._createChangeEvent();
clearInterval(this.int);
}
}, 300);
}
_createChangeEvent = () => {
if ("createEvent" in document) {
const evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
this.input.dispatchEvent(evt);
} else {
this.input.fireEvent("onchange");
}
};
这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点
componentDidMount () {
let tries = 4;
this.int = setInterval(() => {
tries--;
if (tries === 0) {
this._createChangeEvent();
clearInterval(this.int);
}
}, 300);
}
_createChangeEvent = () => {
if ("createEvent" in document) {
const evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
this.input.dispatchEvent(evt);
} else {
this.input.fireEvent("onchange");
}
};
这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点
componentDidMount () {
let tries = 4;
this.int = setInterval(() => {
tries--;
if (tries === 0) {
this._createChangeEvent();
clearInterval(this.int);
}
}, 300);
}
_createChangeEvent = () => {
if ("createEvent" in document) {
const evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
this.input.dispatchEvent(evt);
} else {
this.input.fireEvent("onchange");
}
};
使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值
var Input = React.createClass({
getInitialState: function() {
return {typed: ''};
},
onBlur: function(event) {
this.setState({typed: event.target.value});
},
render: function() {
return <div>
<input type="text" onBlur={this.onBlur.bind(this)}/>
You typed: <code>{this.state.typed}</code>
</div>
}
});
使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值
var Input = React.createClass({
getInitialState: function() {
return {typed: ''};
},
onBlur: function(event) {
this.setState({typed: event.target.value});
},
render: function() {
return <div>
<input type="text" onBlur={this.onBlur.bind(this)}/>
You typed: <code>{this.state.typed}</code>
</div>
}
});
使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值
var Input = React.createClass({
getInitialState: function() {
return {typed: ''};
},
onBlur: function(event) {
this.setState({typed: event.target.value});
},
render: function() {
return <div>
<input type="text" onBlur={this.onBlur.bind(this)}/>
You typed: <code>{this.state.typed}</code>
</div>
}
});
使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值
var Input = React.createClass({
getInitialState: function() {
return {typed: ''};
},
onBlur: function(event) {
this.setState({typed: event.target.value});
},
render: function() {
return <div>
<input type="text" onBlur={this.onBlur.bind(this)}/>
You typed: <code>{this.state.typed}</code>
</div>
}
});
与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。