javascript - Safari/Chrome/Firefox 中的 focus() 与 React 不一致

标签 javascript google-chrome reactjs safari

我最近在跨浏览器测试时遇到了 React 的问题。调用 focus() 时会出现此问题在包含 React 自动生成的元素上 <span>标签。

简化的组件

我的组件,a <Button/> ,是正常 <button> 的抽象具有附加功能。这是一个简化版本:

输出:

<Button value="Button"/>

是:

<button><span>Button</span></button>

由于 React 在跨度中自动换行 float 文本节点,因此它可以分配 data-reactid<button> 内的文本包裹在<span>中标签。

该按钮有一个 onClick()调用方法event.target.focus()在元素上。

问题

在 Chrome/Firefox 中,单击按钮会将焦点设置在按钮上。在 Safari 中,单击按钮并不总是将焦点设置在按钮上。相反,<body>获得焦点。

经过几个小时的摆弄,我发现只有在 React 自动生成的 <span> 之外单击时,按钮才会获得焦点。标签(下面按钮的蓝色区域)。在 <span> 内单击由 React 创建的标签(下面按钮的黑色区域)将导致 <body>以获得焦点。

enter image description here

同样,这只发生在 Safari 中。

在 Chrome/Firefox 中,单击任一区域都会导致 <button>获得焦点。

这是一个CodePen包含完整的示例,重现步骤:

  1. 打开the CodePen在 Safari 中。
  2. 打开控制台。
  3. 单击黑暗区域内的按钮(对应于 <span> 标签)。您会注意到focused元素(使用 document.activeElement )很可能是 <body> .
  4. 单击蓝色区域内的按钮(对应于 <button> 标记。您会注意到 focused 元素是 <button>

问题

是否有一种首选方法可以使跨浏览器的行为保持一致?或者这与 React 无关,只是 Safari/Chrome/Firefox 处理方式的差异 focus()

一种可能的解决方案:设置 pointer-events: none;在内<span>元素。这将允许点击 <span>传播到<button> 。然而,这似乎很黑客。

最佳答案

你可以只使用引用吗?

又名

something(event){
    this.refs.button.focus()
}
render(){
    // stuff
    return (
        <button ref="button" onClick={this.something}>
            {some text here that will make a span element around it}
        </button>
    );
}

sample fiddle

关于javascript - Safari/Chrome/Firefox 中的 focus() 与 React 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36876917/

相关文章:

JavaScript:向密封对象添加属性会引发类型错误异常吗?

javascript - 如何使用 Angularjs 将数据库中的字符串转换为 XML

google-chrome - 垂直对齐 : baseline doesnt work in Chrome

javascript - chrome 中点击是否也会触发鼠标移出

reactjs - react : Delay in updating the state

javascript - 错误: Objects are not valid as a React child (found: Wed Nov 06 2019 19:50:56 GMT+0500 (Uzbekistan Standard Time))

javascript - 需要帮助来延迟 angularjs 中的搜索结果

javascript - HTML5 数据被读取为数字而不是字符串?

google-chrome - Highcharts 工具提示未在 chrome 上显示

reactjs - "import {Something} from somelib"和 "import Something from somelib"React.js 之间的区别