每当我单击/点击/关注该字段时,我都希望获得一个TextField来选择该字段中当前的整个文本。以下代码在Chrome(71.0.3578.98)中有效,但在Safari(12.0.2)中无效。有什么想法吗?
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
return (
<>
<h1>Test Focus React</h1>
<input
type="text"
defaultValue="test"
onFocus={event => {
event.target.select();
}}
/>
</>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
但是这个没有任何React的静态HTML文件在Safari上可以正常工作。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Test Focus JS</title>
</head>
<body>
<h1>Test Focus JS</h1>
<input type="text" value="test" onClick="this.select();" />
</body>
</html>
有人可以帮我看看如何使用React在Safari上进行选择吗?
答案 0 :(得分:1)
我认为您想使用React ref
存储对实际input
DOM元素的引用,以便您可以从select
方法对其调用onClick
查看文档,他们有一个很好的例子,您可以对其进行一些修改以满足您的需求:https://reactjs.org/docs/refs-and-the-dom.html
这应该有效,我认为:
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
class CustomTextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = React.createRef();
this.selectTextInput = this.selectTextInput.bind(this);
}
selectTextInput() {
this.textInput.current.select();
}
render() {
return (
<div>
<input
type="text"
defaultValue="pizza"
ref={this.textInput}
onClick={this.selectTextInput}
/>
</div>
);
}
}
function App() {
return (
<CustomTextInput />
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
答案 1 :(得分:1)
这是一个众所周知的问题,您基本上可以使用set timeout
onFocus={event => {
setTimeout(event.target.select.bind(event.target), 20);
}}
这里正在工作example。我对野生动物园进行了测试,没有任何问题。
答案 2 :(得分:1)
当与DOM交互之类的事情失败时,它通常与事件在不同上下文(反应还是onclick)甚至浏览器(甚至Safari有时具有怪异的优化)中同步/异步触发事件的方式有关。
我猜想它可以通过使其异步来工作,例如:
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
return (
<>
<h1>Test Focus React</h1>
<input
type="text"
defaultValue="test"
onFocus={event => {
// event properties must be copied to use async
const target = event.target;
setTimeout(() => target.select(), 0);
}}
/>
</>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);