autocomplete属性失效的解决方法

  因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便。加了HTML5新属性 :autocomplete = “off” ,但是并没有产生效果。

1

反复测试后发现填充机制是满足下面的格式就自动填充:

1
2
<input type="text"/>
<input type="password"/>

  firefox和360浏览器的处理方式是:只要检测到页面里有满足填充机制的,不管是不是display:none ,只要检测到就直接往里填充。而且是有几个符合条件的就填充几个。

1

  而chrome 54版本略有不同:满足上面的条件且页面里只有一个type=password 的input。才会自动给第一个type=text 的input填充账号,给type=password 的input填充密码。所以chrome 54版本不存在注册页面自动填充的问题。

  Google出来的方法是修改input的type : 页面里input都写成type=text,等获得焦点的时候给改成type=password。下意识去搜了下IE下修改type,发现IE下type是个只读属性,修改type的方法并不能兼容IE。

1

还有说加属性 disableautocomplete的,我试了下不能阻止360浏览器自动填充就没再用。
  于是自己尝试着写了个方法,页面里相应的input写成type=text,当页面加载好后,执行一个10毫秒的定时器,remove掉这些input,重新给页面里添加type=password 的input 。相对应的事件都改成用on绑定。firefox下自动填充的问题解决了,并且也兼容了IE,但是,360浏览器你什么时候添加他什么时候就给你填充

1

也就是说新增的input,360浏览器也要进行检测,所以这个方法不行。
这个时候我有点想放弃了,

1

但是突然想到星爷说的话

1

打起精神继续查找方法,最后发现网易邮箱的输入框是这么写的:autocomplete=”new-password” ,尝试了一下,竟然成功兼容360了!
1
然后试了下给input加 readonly,写在定时器里removeAttr 掉只读属性,因为360浏览器对检测过的input不再检测,所以也能阻止360浏览器自动填充同时兼容IE。
总结解决方法:
在前面加一个

1
<input type="password"/>

并设置display:none; (为了解决360兼容模式/ie)
然后给显示的所有input(我的场景只有三个input,如果是注册页面可以试试只给type=password的input以及之前的type=text 的input加) 加上autocomplete=”new-password” 。自测firefox 360极速/兼容模式下完美解决自动填充问题。
至于给 type=password 的input加 readonly 再remove掉的方法不太优雅,就不采用了。
1