检测浏览器自动填充

IT技术 javascript jquery events event-handling autofill
2021-01-11 22:01:48

如何判断浏览器是否自动填充了文本框?尤其是在页面加载时自动填充的用户名和密码框。

我的第一个问题是页面加载顺序中何时会出现这种情况?它是在 document.ready 之前还是之后?

其次,我如何使用逻辑来确定是否发生了这种情况?不是我想阻止这种情况发生,只是挂接到事件中。最好是这样的:

if (autoFilled == true) {

} else {

}

如果可能的话,我很想看到一个 jsfiddle 显示你的答案。

可能重复

用于浏览器密码自动填充的 DOM 事件?

浏览器自动填充和 Javascript 触发事件

--这两个问题都没有真正解释触发了什么事件,它们只是不断地重新检查文本框(不利于性能!)。

6个回答

问题是不同浏览器对自动填充的处理方式不同。有些派发 change 事件,有些不派发。因此,几乎不可能挂钩浏览器自动完成输入字段时触发的事件。

  • 不同浏览器的更改事件触发器:

    • 对于用户名/密码字段:

      1. Firefox 4、IE 7 和 IE 8 不分派 change 事件。
      2. Safari 5 和 Chrome 9 确实会调度 change 事件。
    • 对于其他表单字段:

      1. IE 7 和 IE 8 不分派 change 事件。
      2. 当用户从建议列表中选择一个值并从该字段中选择一个选项卡时,Firefox 4 确实会调度 change change 事件。
      3. Chrome 9 不会调度 change 事件。
      4. Safari 5 确实会调度 change 事件。

您最好的选择是禁用表单中使用autocomplete="off"的表单的自动完成功能,或者定期轮询以查看其是否已填写。

对于您关于它是在 document.ready 上还是之前填写的问题,它因浏览器而异,甚至因版本而异。对于用户名/密码字段,仅当您选择用户名时才会填写密码字段。因此,如果您尝试附加到任何事件,那么总的来说您将拥有一个非常混乱的代码。

你可以在这里好好读一读

@Bryce 就我个人而言,由于自动填充是在您进入输入区域后发生的事情,因此我会使用“模糊”事件。显然它并不理想,但作为上面列出的浏览器的后备它可能非常有帮助
2021-03-17 22:01:48
请注意,自动完成和自动填充之间存在差异。OP 特指浏览器在页面加载时填写保存的登录详细信息。
2021-03-25 22:01:48
通常的 hack 是在页面的某些重要部分使用鼠标。当用户的鼠标指向按钮或类似的东西时,会触发该事件。
2021-04-01 22:01:48
如果您只想知道文本框中的值是否由 google chrome 自动完成填充,请参阅我的一行答案。
2021-04-01 22:01:48
不要忘记input事件。这就是 Chrome 在自动完成时触发的(如果 Chrome 有自动填充,也可能会自动填充;我总是关闭这些东西)。
2021-04-06 22:01:48

WebKit 浏览器解决方案

来自:-webkit-autofill CSS 伪类的 MDN 文档

:-webkit-autofill CSS 伪类在元素的值被浏览器自动填充时匹配

一旦它被编辑,我们就可以在所需的元素定义一个void transition css规则然后 JS 将能够挂钩该事件。<input>:-webkit-autofillanimationstart

感谢Klarna UI团队。在这里看到他们很好的实现:

除了 CSS 规则之外,这里还需要关键帧github.com/klarna/ui/blob/v4.10.0/Field/styles.scss#L181-L189
2021-03-12 22:01:48
到目前为止,这是最好的解决方案!为此向 Lev 表示敬意。感谢分享 Klarna UI 的解决方案……在我找到这个之前,没有其他东西对我有用。救命稻草!
2021-03-23 22:01:48
这对我来说完美无缺!需要稍微玩弄它以找出确切的方法。感谢 Klarna 团队
2021-03-28 22:01:48

这在最新的 Firefox、Chrome 和 Edge 中对我有用:

$('#email').on('blur input', function() {
    ....
});
很棒的解决方案!此事件组合解决了用户填充和浏览器自动填充的问题。
2021-03-17 22:01:48
'input'这对我来说是最简单的解决方案,但我只测试了自动完成,而不是自动填充。
2021-03-22 22:01:48
每次按键都会触发输入。如果你做一个服务器调用,它可能会经常触发。
2021-03-26 22:01:48
使用一些自动完成附加组件模糊对我不起作用
2021-04-08 22:01:48

我阅读了很多关于这个问题的文章,并希望提供一个非常快速的解决方法来帮助我。

let style = window.getComputedStyle(document.getElementById('email'))
  if (style && style.backgroundColor !== inputBackgroundNormalState) {
    this.inputAutofilledByBrowser = true
  }

inputBackgroundNormalState我的模板在哪里是 'rgb(255, 255, 255)'。

所以基本上当浏览器应用自动完成时,他们倾向于通过在输入上应用不同的(烦人的)黄色来指示输入是自动填充的。

编辑:这适用于每个浏览器

这在 Mozilla 上不起作用,因为背景颜色是通过过滤器应用的,背景颜色仍然是默认的 rgb(255, 255, 255)
2021-03-19 22:01:48
很棒的想法!
2021-03-20 22:01:48

对于谷歌浏览器自动完成,这对我有用:

if ($("#textbox").is(":-webkit-autofill")) 
{    
    // the value in the input field of the form was filled in with google chrome autocomplete
}
这种方法会在其他浏览器上引发错误:“语法错误,无法识别的表达式:不支持的伪:-webkit-autofill”(我在 Firefox 上尝试过)
2021-03-13 22:01:48
它也对我有用。我尝试了数百种解决方案,但没有一个奏效。非常感谢,节省了我的一天以及我一直在寻找解决方案的时间。
2021-03-14 22:01:48
不适用于 chrome 以及 2020 年,也会引发错误 unrecognized expression: unsupported pseudo: -webkit-autofill
2021-03-14 22:01:48