禁止浏览器自动填充到表单

有一个登录页,有一个新建用户页。他们都有form表单,有username和password 两个input。

<form>
    <input type="text" name="username"/>
    <input type="password" name="password"/>
</form>

在登录页的时候浏览器记住了密码,如果去到新建用户页则 username 和 password 会被自动填充上去。

问题是,在新建用户页如何让浏览器不自动填充?(只考虑最新chrome)

其中查了资料http://www.jianshu.com/p/9da6...,用了display:none不生效。在chrome还是会自动填充。

----------分割线----------
已解决。
在前面加一个 <input type="password"/> 并设置css让不在页面中出现即可。

<form>
    <input type="password" style={{position: 'absolute', top: '-999px'}}/>
    <input type="text" name="username"/>
    <input type="password" name="password"/>
</form>

----------分割线----------

so,浏览器的自动填充原理是啥?

阅读 25.7k
评论 更新于 2016-07-27
    11 个回答
    mecode
    • 264

    Mozilla 官方文档建议

    Mozilla developer documentation 建议使用表单设置属性 tautocomplete=”off” 来阻止浏览器从cache获取数据填充登录表单。

     <input type="text" name="foo" autocomplete="off" />
    

    但是这种方案不兼容某些Chrome、Firefox。

    兼容所有浏览器

    最终决定使用使用隐藏input来接受浏览器自动填充,这样不会影响用户体验,也可以兼容所有浏览器。

      <input style="display:none"><!-- for disable autocomplete on chrome -->
      <input type="text" id="username"  name="username"  autocomplete="off">
    

    但是实际上在Chrome上并没什么用,在FireFox上也只能阻止用户名自动填充。

    接着搜索,又发现了个新东西

    <input type="password"  autocomplete="new-password">
    

    把password的autocomplete属性由off变成了new-password,发现Chrome不自动填充了,但是FireFox上仍然会填充用户名

    再接着结合第一点尝试,最后结果是使用以下方式

     <input type="password" style="display: none;"/>
     <input type="text" autocomplete="off"/>
    
     <input class="form-control" type="password" name="tradePassword" id="txPassword" autocomplete="new-password"
    

    这样在Chrome和FireFox上就都不会填充了。

    评论 赞赏 2017-07-18
      小胖
      • 1.1k

      input框有个属性autocomplete默认是on,设成off,ok

      评论 赞赏 2016-07-27
        test
        • 36

        直接对input password 加这个 ===> autocomplete = 'new-password'

        评论 赞赏 2017-05-08
          fulu
          • 2
          • 新人请关照

          在表单第一行加这一句,亲测有效
          <input type="password" autocomplete="new-password" style="position: absolute; top: -999px;">

          评论 赞赏 2018-12-07

            要求将不可见的input框放在页面的最前面,如body起始处, chrome之类的浏览器会填充最前面的输入框。

            <!-- 阻止浏览器的自动填充 -->
            <input type="text" name="_prevent_auto_complete_name" 
              autocomplete="off" readonly="readonly" style="display: none !important;"/>
            <input type="password" name="_prevent_auto_complete_pass" 
              autocomplete="new-password" readonly="readonly" style="display: none !important;" />

            chrome有两种填充, 一种是自动填充表单 autofill, 一种是自动完成密码 autocomplete; 请在需要的页面中进行设置。

            最新的问题,Chrome-72版本,将用户确定保存的用户名和密码强制填充到表单之中了,导致显示问题。
            以上代码实测生效。

            评论 赞赏 2019-03-05
              godruoyi
              • 2.8k
              评论 赞赏 2016-07-27

                我是在修改密码页面遇到类似问题,在Firefox、360极速/兼容模式下已经保存在此域名下的账号会自动填充。解决方法:

                在前面加一个 <input type="password"/> 并设置display:none; (为了解决360兼容模式/ie)
                然后给显示的所有input(我的场景只有三个input,如果是注册页面可以试试只给type=password的input以及之前的type=text 的input加) 加上autocomplete="new-password" 。自测firefox  360极速/兼容模式下完美解决自动填充问题。
                评论 赞赏 2017-03-16
                  lonlie
                  • 1
                  • 新人请关照
                          <div class="form-group">
                              <label class="col-sm-1 control-label">用户名:</label>
                              <div class="col-sm-3">
                                  <input type="text" id="LoginId" style="display:none;" />
                                  <input id="LoginId" name="LoginId" type="text" />
                                  <input type="text" id="LoginId" style="display:none;" />
                              </div>
                          </div>
                          <div class="form-group">
                              <label class="col-sm-1 control-label">密码:</label>
                              <div class="col-sm-3">
                                  <input type="password" id="Pwd" style="display:none;" />
                                  <input id="Pwd" name="Pwd" type="password" />
                              </div>
                          </div>

                  保持同一Id即可,但是只有一个表单项有name属性,这样可以保证后台取值正常。
                  同时适用于手机浏览器。

                  评论 赞赏 2018-03-28
                    youyou
                    • 3
                    • 新人请关照

                    楼上种种答案不适用于搜狗浏览器的极速模式, (适用于兼容模式),所以另附一种思路(在我这可用): 在html中给表单加上readonly属性,禁止浏览器自动填充;在js中,设置timeout,短时间内清除掉表单的只读属性,变得可为用户所填充

                    <input type="text" name="name" id="name" readonly="readonly">
                    <input type="password" name="password" id="password" readonly="readonly">
                    
                    <script>
                        window.setTimeout(function(){
                            document.getElementById("name").removeAttribute("readonly");
                            document.getElementById("password").removeAttribute("readonly");
                        },1000);
                    </script>
                    评论 赞赏 2018-09-13

                      Chrome浏览器
                      版本 71.0.3578.98(正式版本) (64 位)

                      设置autocomplete="off",如下:

                      <input type="text" autocomplete="off" />

                      实测可以。

                      所以不要完全相信赞同数最高的答案,要自己验证。

                      评论 赞赏 2019-04-08
                        xiayefeng
                        • 2
                        • 新人请关照

                        加个 value=""就可以了,

                        评论 赞赏 2019-09-04
                          撰写回答

                          登录后参与交流、获取后续更新提醒