【问题标题】:Populate state with values from autocomplete (react)使用来自自动完成的值填充状态(反应)
【发布时间】:2018-12-14 01:32:41
【问题描述】:

我有一个带有输入字段的组件和一个按钮,除非在输入字段中输入了正确的值,否则该按钮会被禁用。这工作正常,但是当 chrome 在页面加载时自动完成这些值时,状态不会改变,因此按钮保持禁用状态。如果您在表单内部单击或更改值,则状态会正确更改。

如何在组件加载时从自动完成中获取值?自动完成不会触发 onChange 或 onBlur 事件,并且 autocomplete="off" 也不起作用。 (我也不想关闭自动完成)

【问题讨论】:

  • 在组件的渲染事件之后检查是否有任何字段已经有值?如果是这样,相应地更新状态。每个浏览器处理自动填充的方式不同,因此我们无法关联将触发的事件。基于 webkit 的浏览器会为自动填充的元素添加一个类,您可以检测到,但这不适用于非基于 webkit 的浏览器。
  • 尝试这样做,但我怎样才能获得这些值?在 componentDidMount() 中,该值仍然是 ''。参考也不起作用。也许我可以用 setTimout 破解它,但这似乎是错误的。在 chrome 控制台中使用普通的旧 js,我可以访问这些值,但不能做出反应。
  • 可以得到HTML节点的实际值。所以我会查询选择器所有输入节点,并将它们的值与状态中的值进行比较,以便组件的状态再次与 HTML 输入的状态匹配。
  • 感谢您的帮助。当我从 react 访问 dom 节点时(即使超时)它没有值(我尝试了普通的 document.querySelector 和 refs)。看来这个问题自 2014 年以来一直存在,但仍未解决:github.com/facebook/react/issues/1159 我想暂时启用该按钮,并在表单更改后将其禁用(并且值不正确)
  • 我们无法解决它,因为自动完成功能在所有浏览器中的工作方式不同。所以我们必须通过比较值来修复它,直到浏览器处理自动完成的标准化方式。但这将需要几年的时间,没有准备好解决这个问题的规范。所以我知道 facebook 不会将非生产就绪的东西放入反应中。

标签: javascript reactjs google-chrome autocomplete


【解决方案1】:

我最近在处理登录页面时遇到了这个问题。经过一番研究,我在 ReactJS github 上看到了 this issue 的报道。引用关键部分:

如果我们能够在页面加载后访问自动填充的值,那么编写恶意代码来提取用于网络钓鱼的表单上的信息将变得非常容易。给用户没有反应的机会。可能是浏览器忽略 autocomplete="off" 的部分原因。

为了克服这个问题,我们需要:

  1. 接受这样一个事实,即当 DOM 节点挂载时,我们不会(也永远不会)访问自动填充的值
  2. 接受浏览器带来的安全问题

tl;dr - 出于安全原因,最好在提交时验证输入。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2016-02-08
    • 2016-05-05
    • 2016-11-16
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多