2016年7月8日的有效答案
Adam正确指出这是一个漏洞(或者是预期行为)。然而,之前的回答都没有说明如何解决这个问题,因此这里提供一种方法来强制Chrome将自动填充的值视为真实值。
需要按顺序执行几件事情,而且这只需要在Chrome中运行而不是Firefox中,因此需要使用if
语句。
首先我们聚焦于该元素。然后我们创建一个新的TextEvent
,并运行initTextEvent
,它会在值的开始添加我们指定的自定义字符串(我使用了“@@@@@”),从而触发Chrome开始像值是真实的一样工作。然后我们可以删除添加的自定义字符串,最后取消聚焦。
代码:
input.focus();
var event = document.createEvent('TextEvent');
if ( event.initTextEvent ) {
event.initTextEvent('textInput', true, true, window, '@@@@@');
input.dispatchEvent(event);
input.value = input.value.replace('@@@@@','');
}
input.blur();
2016年8月10日修改:
目前此方法仅适用于 Chrome 浏览器在 Windows 和 Android 平台上。无法在 OSX 平台上使用。另外,根据以下消息,此方法将会在 2016 年 9 月停止使用:
https://www.chromestatus.com/features/5718803933560832
同时,我已经提交了一个 Chromium 报告。
https://bugs.chromium.org/p/chromium/issues/detail?id=636425
截至 8月12日,Chrome 团队的一名成员在上述报告中表示,行为不会发生变化,因为他们认为这不是一个bug。
长期解决建议:
尽管如此,当前的行为已经与最初实现时有所调整。现在用户不必与密码输入进行交互即可报告值。现在用户只需与页面的任何部分进行交互(发送鼠标或键盘事件)即可。这意味着,虽然在页面加载时运行验证仍然无法工作,但单击提交按钮将会导致 Chrome 正确报告密码值。因此,解决方法是在提交时重新验证可能自动完成的所有输入,如果您正在尝试自动完成。
2016年12月13日修改:
一个新的 Chromium 报告已经开启,并且得到了更好的接受。如果您有兴趣改变 Chrome 的这种行为,请点赞这个新报告:
https://bugs.chromium.org/p/chromium/issues/detail?id=669724
input type="password"
字段后保存了用户/密码,我可以看到密码的值与从Chrome保存密码时相同,当你点击“为此页面保存密码”。 - onetwo12