无法在IE11中使用JavaScript聚焦输入
我无法让IE11在将输入元素插入DOM后对其进行聚焦。该元素在聚焦后不会接收文本输入,但其占位符文本不再可见。元素由React创建,我通过无法在IE11中使用JavaScript聚焦输入,javascript,internet-explorer,reactjs,react-jsx,Javascript,Internet Explorer,Reactjs,React Jsx,我无法让IE11在将输入元素插入DOM后对其进行聚焦。该元素在聚焦后不会接收文本输入,但其占位符文本不再可见。元素由React创建,我通过componentDidMount中React的refs对象访问它: componentDidMount() { this.refs.input.getDOMNode().focus(); } 我已尝试使用setTimeout添加短延迟: componentDidMount() { setTimeout(() => this.refs.
componentDidMount
中React的refs
对象访问它:
componentDidMount() {
this.refs.input.getDOMNode().focus();
}
我已尝试使用setTimeout
添加短延迟:
componentDidMount() {
setTimeout(() => this.refs.input.getDOMNode().focus(), 10);
}
我还尝试将“1”
的选项卡index
添加到输入中
如果有帮助,下面是呈现的JSX:
<div style={style}>
<div style={labelStyle}>Enter a name to begin.</div>
<form onSubmit={this.submit} style={formStyle}>
<input
tabIndex="1"
ref="input"
value={this.state.username}
onChange={this.updateUsername}
placeholder="New User Name"
style={inputStyle}
/>
<button {...this.getBrowserStateEvents()} style={this.buildStyles(buttonStyle)}>Create</button>
</form>
</div>
输入要开始的名称。
创造
在IE11中,是否有一些我不知道的让焦点工作的技巧?我认为您的问题不是来自focus()函数,而是来自选择器 为了证明这一点,我刚刚打开我的IE11,并尝试使用以下命令将SO搜索输入集中在页面的右上角:
document.getElementById('search')[0].focus()
因此,只需打开IE控制台(F12)并键入,它就可以聚焦搜索输入。如果是这样的话,那么问题就来自于选择器,它不是您可能认为的输入
它适用于我的IE 11.0.9600.17905当css属性
-ms user select:none
应用于输入时,IE11中的问题被打破。因此,通过改变:
* {
-ms-user-select: none;
}
进入
我能解决这个问题。这是一个用于复制问题的代码笔:
如中所述,当设置css属性-ms user select:none时,在IE11中运行元素.focus()
无效。
解决方法可以是
element.style['-ms-user-select'] = 'text';
element.focus()
element.style['-ms-user-select'] = '';
在IE中不起作用:
(代码:)
也在IE中工作:
(代码:)
注意:这种情况也会发生,例如
:-ms-input-placeholder {
-ms-user-select: none;
}
请参见问题只存在于IE中。focus在Chrome和Firefox中运行良好。此外,输入还接收到某种部分焦点(我可以单击它,占位符文本会重新出现,但如果不再次单击它,我就无法键入文本)。我也没有使用选择器;我正在使用react的refs
对象。那么问题可能来自react的refs对象,我不知道这是什么,但如果是第三方库或其他东西,问题可能直接来自他们。我能看到的是,当用于输入时,focus()
在IE11上正常工作。input
对于ref名称来说似乎是一个糟糕的选择。您是否使用了其他生命周期方法?我想知道调用componentdiddupdate
是否弄乱了componentDidMount
中的焦点设置。问题是由-ms用户选择:none
css属性引起的。啊,我明白了-我想你可以接受你自己的答案。我可以。我只需要在发布后等待24小时。我很感激这个问题已经解决,但又提出了另一个问题。用户无法选择输入文本。如何解决这些问题?
:-ms-input-placeholder {
-ms-user-select: none;
}