我们有一个相对简单的 React 组件,其中包含一个input元素:
export class MyInput extends Component {
componentDidMount() {
function log(e) {
console.log(`Event: ${e.type}, isTrusted: ${e.isTrusted}, input value: ${e.target.value}`, e);
}
this.rawInput.addEventListener("change", log);
this.rawInput.addEventListener("input", log);
}
onChanged(e) {
console.log("raw-input.onChanged: e.target.value", e.target.value);
this.props.onChanged(e.target.value);
}
render() {
return (
<div className="my-class">
<input
value={this.props.value}
onChange={this.onChanged.bind(this)}
ref={(input) => { this.rawInput = input; }}
/>
</div>
);
}
}
基本上,这只是一个稍微包装的input元素,而在顶部添加的日志记录用于调试目的。
它在常规使用中可以很好地处理打字,它还可以SendKeys在 Chrome、Firefox 和 IE 11 中的 Selenium WebDriver 下处理(前提是 WebDriverEnableNativeEvents是true)。
但是,当通过 WebDriver 在 Internet Explorer 11 中运行并使用 时EnableNativeEvents = false,在执行onChanged时不会触发该事件SendKeys。最奇怪的input是触发了 HTML事件。下面是控制台输出:

请注意,在value键入“test”时,输入正在发生变化,但没有onChange.
如果用户然后在相同的输入中通过键盘键入,则onChange事件在那里:

仔细分析,input事件的唯一区别是在WebDriver下isTrusted: false,而在真正的打字上isTrusted: true。
问题是为什么在第一种情况下onChangeReact 不会触发事件?
我认为这是因为 React 跳过了事件,isTrusted: false因为这意味着它们是模拟的,而不是真实的用户事件。但是,我无法为此找到任何证据。如果是这种情况,您介意在处理它的 React 源代码中提供一个帖子的链接或一行吗?
- react:16.7.0
- Selenium.WebDriver.IEDriver: 3.14.0

