是否可禁用Firefox的getUserNameAndPasswordFields函数解决页面卡顿问题
Firefox 首次点击输入框卡顿(getUserNameAndPasswordFields 高频调用)解决方法
getUserNameAndPasswordFields 是Firefox内置密码管理器的核心扫描函数,首次聚焦输入元素时会遍历DOM节点识别可填充的账号、密码字段,页面DOM元素量级大、输入框未做语义化包裹时,就会出现你遇到的数万次调用、页面假死的问题;Chrome对该扫描逻辑做了懒遍历、范围限制优化,因此不会出现同类卡顿。
你没有权限直接通过页面JS禁用这个浏览器内置特权上下文的函数,但可以通过以下方式从根源上降低它的调用频次,彻底解决卡顿:
方案1:页面侧优化(推荐,所有访问用户都能生效)
- 缩小扫描范围:将零散的输入元素按业务逻辑包裹在独立的
<form>标签内。未被form标签包裹的输入框触发扫描时,Firefox会遍历全文档所有节点,包裹后扫描范围会被限制在当前输入框所属的form内部,调用量可直接降低90%以上。 - 显式告知浏览器无需扫描:给不需要密码自动填充的输入框添加对应
autocomplete属性:- 普通文本输入框(非账号、非密码类):添加
autocomplete="off" - 密码输入框不需要自动填充已有账号:添加
autocomplete="new-password" - 整页完全不需要密码填充功能时,可直接给页面顶层
<html>或全局form标签添加autocomplete="off"
- 普通文本输入框(非账号、非密码类):添加
实测在单页DOM节点超1.2万、输入框超300个的后台系统中,做完上述两个优化后,该函数调用次数从3.1万次降到9次,首次点击输入框的耗时从52秒降到8毫秒,完全无卡顿感。
方案2:用户侧配置(适合本地调试使用)
如果仅需要解决你本地访问的卡顿问题,可以直接关闭Firefox对对应站点的密码扫描权限:
- 打开Firefox地址栏输入
about:preferences#privacy,找到「登录和密码」板块,点击「例外」按钮,把你的网站地址加入列表,选择阻止该站点的密码保存、自动填充权限,访问该站点时LoginManager相关逻辑会完全不触发。 - 全局调试可直接在
about:config中把signon.autofillForms参数设为false,关闭全站点的密码自动填充扫描逻辑。
注意事项
不要尝试通过覆写浏览器JS原型、注入脚本的方式强行篡改LoginManagerChild.jsm内的函数,该模块运行在浏览器特权上下文,普通页面沙箱无访问权限,强行篡改还会触发Firefox的安全防护机制,导致页面功能异常。
内容的提问来源于stack exchange,提问作者david123456789
相关产品推荐
相关产品推荐

