网站密码自动填充失效(无autocomplete=off),如何用Tampermonkey恢复?
问题分析与解决方案
可能的密码自动填充禁用手段
开发者除了设置autocomplete="off",还可能用以下方法阻止密码自动填充:
- 动态JS重置属性:页面加载后通过JavaScript动态修改输入框的
autocomplete属性,或者监听focus/input事件拦截自动填充行为,手动修改HTML后会被脚本覆盖。 - Angular Material/CDK的特殊处理:从HTML片段里的
cdk-text-field-autofill-monitored类可以看出,页面用了Angular CDK的文本框自动填充监控组件,这个组件可能会干扰浏览器的自动填充逻辑,甚至主动阻止填充。 - 缺失标准字段标识:浏览器识别密码框通常依赖
name="password"或autocomplete="current-password"属性,你的密码框只有formcontrolname="password"(Angular框架用的),没有标准的name属性,导致浏览器无法识别这是密码输入框。 - 隐藏前置密码框:部分网站会在页面中添加隐藏的
type="password"输入框,让浏览器先填充这个隐藏框,真正的密码框就无法获取填充内容。 - 表单结构不规范:密码框所在的表单没有正确的结构,或者没有和用户名框形成关联的登录表单结构,浏览器无法识别这是登录场景。
Tampermonkey/Greasemonkey脚本解决方案
针对这个Angular Material构建的页面,可以用以下脚本强制恢复密码自动填充:
// ==UserScript== // @name Windtre Login Password Autofix // @namespace http://tampermonkey.net/ // @version 0.1 // @description 恢复Windtre登录页的密码自动填充功能 // @match https://ac.windtre.it/oa/auth/login // @grant none // ==/UserScript== (function() { 'use strict'; // 等待"ENTRA"点击后密码框加载完成 const observer = new MutationObserver((mutations) => { const passwordInput = document.querySelector('#mat-input-1, input[formcontrolname="password"]'); if (passwordInput && !passwordInput.getAttribute('name')) { // 添加标准name属性和autocomplete标识 passwordInput.setAttribute('name', 'password'); passwordInput.setAttribute('autocomplete', 'current-password'); // 移除Angular CDK的监控类,避免干扰 passwordInput.classList.remove('cdk-text-field-autofill-monitored'); // 触发focus事件,触发浏览器自动填充 setTimeout(() => passwordInput.focus(), 100); observer.disconnect(); } }); // 监听DOM变化,等待密码框出现 observer.observe(document.body, { childList: true, subtree: true }); })();
使用说明
- 安装Tampermonkey/Greasemonkey扩展
- 新建脚本,粘贴上述代码并保存
- 刷新目标登录页,点击"ENTRA"后脚本会自动处理密码框,触发自动填充
额外排查点
- 检查页面是否存在隐藏的密码输入框:打开浏览器开发者工具,搜索
type="password",看是否有display: none或visibility: hidden的元素,若有可以用脚本移除或修改其属性。 - 尝试手动触发自动填充:在密码框focus后,使用浏览器的快捷键(比如Safari的
Cmd+Shift+A)手动唤起自动填充菜单,看是否能正常显示密码选项。
内容的提问来源于stack exchange,提问作者fferri
相关产品推荐
相关产品推荐

