阻止浏览器对表单自动填充

当用户在进行登录等操作提交表单后,浏览器会提示是否允许浏览器记住密码。

记住用户名密码在一定程度上会给用户体验带来好处,比如,当用户在下一次打开此登录页面表单会自动填充,直接登录

然而,也会带来一定坏得影响,比如该网站下存在另外需要填充密码的表单时,不对应的密码和用户名会自动填充该表单上(大致表现为,密码输入框会自动填充所保存密码,密码输入框的上一个输入框会自动填充用户名),用户需要清空后再填写正确的用户名密码,使操作繁琐,用户体验差。

解决办法:

google之后发现据说 autocomplete=“off” 可以解决,但是chrome等不兼容,所以不可行。

猜想,浏览器自动填充识别的是 type="password" 然后将该input自动填入密码

那么,我们考虑将type=“password” 改为 type="text" ,然后再在必要的时候将其改回password

这个必要的时候我们选择在当密码的input获得焦点时,即在onFocus时改变type="password"

ok,我们组织代码如下    

// 这里使用jquery

$("#psw").focus(function(event) {
   $(this).attr('type','password');
});

ok,我们测试一下,诶,很顺利....诶???纳尼??lt ie8 ,ie8下无论怎样也不能修改到type的值

好吧,ie8以下行不通,寻找补救方案

既然不能修改,那么我们就插入新的input type="password" 进去,所以,前提我们要判断浏览器版本是小于ie8的版本

这里有一个很实用得办法

<!--[if lt ie9]><![endif]--> 这个标签大家都熟悉的多,而且它的特点是只有ie浏览器认识它,太棒了,就用它

var isLTIE9 = function(){
    var bObj = document.createElement('b');
    bObj.innerHTML = '<!--[if lt IE 9]><i></i><![endif]-->';
    return bObj.getElementsByTagName('i').length === 1;
}

这样我们就可以判断出小于ie9的ie浏览器了

汇总:

var isLTIE9 = function(){
    var bObj = document.createElement('b');
    bObj.innerHTML = '<!--[if lt IE 9]><i></i><![endif]-->';
    return bObj.getElementsByTagName('i').length === 1;
}
if(!isLTIE9()) {
   $("#psw").focus(function(event) {
      $(this).attr('type','password');
   });
}else{
   var pswInput = document.getElementById("psw");
   var pswInput2 = pswInput.cloneNode(false);
   pswInput2.type='password';
   pswInput.parentNode.replaceChild(pswInput2,pswInput);
}

在使用 NG-ZORRO 组件库时,如果希望阻止浏览器自动填充密码字段,可以通过在 `nz-input` 或原生 `<input>` 元素中添加特定的属性来实现。尽管 NG-ZORRO 的文档中没有专门针对密码自动填充的配置项,但可以通过 HTML 属性和自定义指令来实现控制浏览器行为的目的。 ### 使用 `autocomplete` 属性 最常见的方式是在密码输入框中设置 `autocomplete="new-password"` 或 `autocomplete="off"` 属性。这种方式被广泛支持,并且可以有效阻止大多数现代浏览器自动填充行为: ```html <nz-input type="password" autocomplete="new-password"></nz-input> ``` 或 ```html <input type="password" nz-input autocomplete="off" /> ``` ### 自定义指令防止自动填充 在某些情况下,浏览器可能忽略 `autocomplete="off"`,尤其是对于密码字段。为了解决这个问题,可以创建一个自定义指令来动态修改 `autocomplete` 的值,或者在输入框中插入一个隐藏的文本框来“欺骗”浏览器: ```ts import { Directive, ElementRef, Renderer2, AfterViewInit } from '@angular/core'; @Directive({ selector: 'input[nz-input][type="password"]' }) export class DisableAutocompleteDirective implements AfterViewInit { constructor(private el: ElementRef, private renderer: Renderer2) {} ngAfterViewInit() { this.renderer.setAttribute(this.el.nativeElement, 'autocomplete', 'new-password'); } } ``` 然后在模块中注册该指令,并将其应用到所有密码输入框上。 ### 隐藏输入框欺骗法 另一种方法是在表单中添加一个隐藏的输入框,使浏览器自动填充内容填充到这个隐藏的字段中,而不是实际的密码框中: ```html <div style="position: absolute; left: -9999px;"> <input type="text" /> <input type="password" /> </div> <input type="password" nz-input autocomplete="off" /> ``` ### 注意事项 - 不同浏览器对 `autocomplete` 的处理方式不同,因此建议进行多浏览器测试。 - 在 Angular 表单中,确保 `autocomplete` 属性不会影响表单验证或提交行为。 - 如果使用了第三方表单管理库,可能需要额外配置以兼容自动填充控制逻辑。 通过上述方法,可以在 NG-ZORRO 中有效地控制浏览器对密码字段的自动填充行为,从而提升用户体验并避免潜在的安全隐患[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值