如何禁用Edge浏览器<input>自动填充以解决Angular 4 Typeahead冲突
我之前也碰到过Edge这个烦人的原生自动补全弹窗覆盖Typeahead下拉框的问题,尤其是用户有历史输入的时候,很容易误选原生提示项。给你几个亲测有效的解决办法,适配Angular 4场景:
禁用输入框原生自动补全
这是最直接的办法,给Typeahead对应的input标签添加autocomplete属性。先试试标准的autocomplete="off":<input type="text" [ngbTypeahead]="search" autocomplete="off" />如果Edge无视这个属性(毕竟Edge有时候会有兼容性小问题),可以换用
autocomplete="none",或者用一个小trick:autocomplete="new-password"。浏览器通常不会对标记为密码新输入的字段触发自动补全,能完美绕过Edge的原生提示。动态控制只读状态绕过自动补全
要是上面的属性还是不生效,可以试试让输入框默认处于只读状态,用户点击后再取消只读,这样Edge不会提前加载历史输入提示。在Angular里可以这么写:
模板部分:<input type="text" [ngbTypeahead]="search" [readonly]="isInputReadOnly" (click)="isInputReadOnly = false" (blur)="isInputReadOnly = true" />组件类里初始化状态:
isInputReadOnly = true;这样用户点击输入框前,输入框是只读的,Edge不会触发自动补全;点击后可编辑,Typeahead的下拉框能正常弹出。
提高Typeahead下拉框的层级
如果不想禁用原生自动补全,只是想让Typeahead的下拉框显示在上面,可以通过CSS调高它的z-index:/* 这里的类名要对应你用的Typeahead组件生成的下拉框类,比如ng-bootstrap的就是dropdown-menu */ .dropdown-menu { z-index: 9999 !important; }把层级设得足够高,就能确保Typeahead的下拉框覆盖在Edge的原生提示之上。
另外提一句,如果你用的是第三方Typeahead组件(比如ng-bootstrap的NgbTypeahead),可以先看看组件文档有没有内置的禁用原生自动补全的配置项,有些组件已经封装好了对应的属性,不用自己手动加原生属性~
内容的提问来源于stack exchange,提问作者Sam

