gpt4 book ai didi

javascript - React Redux onBlur 事件在 Safari 和 Firefox 中未触发

转载 作者:行者123 更新时间:2023-12-03 04:08:37 27 4
gpt4 key购买 nike

这似乎在 Chrome 和 Edge 中完美运行。我有一个工具提示,需要在单击按钮时弹出,然后在模糊时消失。由于某种原因,onBlur 事件在 Safari 或 Firefox 上根本不会触发。

我尝试在handleBlur中登录到控制台,但没有达到那么远,就好像onBlur在此上下文中不存在一样。

class Tooltip extends Component {
componentWillUnmount() {
this.closeActiveTooltip();
}

handleKeyPress = (event) => {
if (event.keyCode === 27) { // Esc key
this.closeActiveTooltip();
}
}

handleBlur = () => {
if (this.props.activeTooltip === this.props.name) {
// setTimeout is for link click
setTimeout(this.closeActiveTooltip, 100);
}
}

closeActiveTooltip = () => {
const { activeTooltip, closeTooltip } = this.props;

if (activeTooltip) {
closeTooltip(activeTooltip);
}
}

render() {
const {
isOpen,
text,
link,
position,
} = this.props;
const popupClassName = getClassNameFor(s, 'popup', `${isOpen && 'open'} ${position}`);
const linkElement = (
<div className={s.link}>
<a
href={link}
target="_blank"
rel="noopener noreferrer"
>
More info here
</a>
</div>
);

return (
<button
type="button"
className={s.root}
onClick={this.props.toggleTooltip}
onBlur={this.handleBlur}
onKeyDown={this.handleKeyPress}
>
<svg className={s.icon}>
<use xlinkHref="#more-info" />
</svg>
<div className={popupClassName}>
{text}
{link && linkElement}
</div>
</button>
);
}
}

最佳答案

我所知道的是,我永远无法获得一个专注于 React 挂载的元素(很可能是 <input /> ),可能是因为 render() s,所以我使用 setTimeout(() => input.focus(), 0)使其异步。所以,焦点处理似乎存在问题......

一个简单的解决方法是:

<button
onClick={this.handleAction}
onMouseDown={this.handleFocus}
onMouseUp={this.handleBlur} />

但是当用户释放鼠标按钮时,您将永远不会触发 onMouseUp .

更好的解决方法是模拟点击:

class Tooltip extends Component {
componentDidMount() {
document.body.addEventListener('click', this.handleClickOut, false);
}

componentWillUnmount() {
document.body.removeEventListener('click', this.handleClickOut, false);
}

handleClickOut = event => {
if(event.target != this.refs.btn) { // Actually more complicated, event.target can be a child of button (icon, span, etc)
this.handleBlur();
}
}

handleBlur() {}

render() {
return (
<button
ref='btn'
type="button"
>
{text}
</button>
);
}
}

可能有一个包装按钮的组件

<ClickOut onClickOut={this.handleBlur}>
<button
onClick={this.handleAction}
onMouseDown={this.handleFocus} />
</ClickOut>

每当您单击文档时,如果 target不是<button />或其子节点之一,触发click out伪事件

关于javascript - React Redux onBlur 事件在 Safari 和 Firefox 中未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44431931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com