停止 chrome 按 id 自动填充/建议表单字段

Stop chrome auto filling / suggesting form fields by id

好吧...和许多其他帖子一样,这让我抓狂。 Chrome 不断为我不希望它出现的字段提供自动完成建议。它与软键盘一起占据了整个页面,这会阻止用户查看/表单不是为了填充我们的用户数据,而是一个以前未知的新地址。

到目前为止我已经把它们都打开了

<form autocomplete="off">

<input autocomplete="randomstringxxx">

它们的效果已被注意到,chrome 不再填写整个表单 - 但它仍然想为我表单中的每个元素提出单个字段建议。

我终于意识到它现在从我的表单元素中获取 id/name 字段。

即下面会给我一个我以前用过的名字列表。

<input id="contact_name" name="contact_name">

任何人都可以建议一种无需重命名元素即可停止此操作的方法吗?它们与我数据库中的字段相关联,理想情况下我不必手动重命名并将它们匹配在一起。

例子-

https://jsfiddle.net/drsx4w1e/ 使用随机字符串作为自动完成元素属性 - STILL AUTOCOMPLETING

https://jsfiddle.net/drsx4w1e/1/ 以“关闭”作为自动完成属性。 - 仍在自动完成

https://jsfiddle.net/6bgoj23d/1/ 删除标签/ids/名称属性时没有自动完成的示例 - NOT AUTOCOMPLETING

例子

我知道这并不理想,因为它更改了输入的名称,但它只是暂时的。更改名称属性是我发现完全删除自动完成的唯一方法。

这个解决方案都是用 JS 和 HTML 但我认为如果用服务器端语言实现会更好,例如 PHP 或 Java.

我发现 autocomplete="none" 最适合 chrome 但它不能完全关闭自动完成。

工作原理

因此,在页面加载时,此解决方案会向每个输入名称添加一串随机字符。

eg. 'delivery_contact_name' becomes 'delivery_contact_nameI5NTE'

提交表单时,它会调用一个函数 (submission()),该函数会删除添加的随机字符。因此提交的表单数据将具有原始名称。

参见下面的解决方案:

<html>
  <body>
    <form autocomplete="none" id="account_form" method="post" action="" onsubmit="return submission();">
     
        <div class="my-2">
          <label for="delivery_contact_name" class="">*</label>
          <input autocomplete="none" class="form-control" id="delivery_contact_name" maxlength="200" minlength="2" name="delivery_contact_name" required="" type="text" value="">
        </div>
        <div class="my-2">
          <label for="delivery_telephone" class="">Telephone*</label>
          <input autocomplete="none" class="form-control" id="delivery_telephone" maxlength="200" minlength="8" name="delivery_telephone" required="" type="tel" value="">
        </div>
        <div class="my-2">
            <label for="delivery_address_1" class="">Delivery Address*</label>
            <input autocomplete="none" class="form-control" id="delivery_address_1" maxlength="50" minlength="2" name="delivery_address_1" required="" type="text" value="">
          </div>
          <div class="my-2">
            <label for="delivery_address_2" class="">Delivery Address*</label>
            <input autocomplete="none" class="form-control" id="delivery_address_2" maxlength="50" minlength="2" name="delivery_address_2" required="" type="text" value="">
          </div>
          <div class="my-2">
            <label for="delivery_address_3" class="">Delivery Address</label>
            <input autocomplete="none" class="form-control" id="delivery_address_3" name="delivery_address_3" type="text" value="">
          </div>
          <div class="my-2">
            <label for="delivery_address_4" class="">Delivery Address</label>
            <input autocomplete="none" class="form-control" id="delivery_address_4" name="delivery_address_4" type="text" value="">
          </div>
          <div class="my-2">
            <label for="delivery_address_postcode" class="">Delivery Postcode*</label>
            <input autocomplete="none" class="form-control" id="delivery_address_postcode" maxlength="10" minlength="6" name="delivery_address_postcode" required="" type="text" value="">
          </div>
        <input type="submit" name="submit" value="Send">
    </form>
  </body>
  <script>
    
      //generate a random string to append to the names
      const autocompleteString = btoa(Math.random().toString()).substr(10, 5);

      //get all the inputs in the form
      const inputs = document.querySelectorAll("input");

      //make sure script calls function after page load
      document.addEventListener("DOMContentLoaded", function(){
        changeInputNames();
      });

      //add random characters to input names
      function changeInputNames(){
        for (var i = 0; i < inputs.length; i++) {
          inputs[i].setAttribute("name", inputs[i].getAttribute("name")+autocompleteString);
          }
      }

      //remove the random characters from input names
      function changeInputNamesBack(){
        for (var i = 0; i < inputs.length; i++) {
          inputs[i].setAttribute("name", inputs[i].getAttribute("name").replace(autocompleteString, ''));
          }
      }
     
      
    function submission(){
      let valid = true;
      //do any additional form validation here
      if(valid){
        changeInputNamesBack();
      }
      return valid;
    }
    
  </script>
</html>

感谢@rydog 的帮助。我已将其更改为我放入 js 文件的函数,因为我不想手动添加到每个页面/在每个页面上触发 - 我还使用 js 添加了提交事件处理程序,而不是添加到在提交表单时。

Rydog 的出色解决方案


function stop_autofill() {

    //generate a random string to append to the names
    this.autocompleteString = btoa(Math.random().toString()).substr(10, 5);

    this.add_submit_handlers = () => {
        document.querySelectorAll("form").forEach(value => {
            value.addEventListener("submit", (e) => {
                this.form_submit_override(e)
            })
        })
    }

    //add random characters to input names
    this.changeInputNames = () => {
        for (var i = 0; i < this.input_elements_arr.length; i++) {
            this.input_elements_arr[i].setAttribute("name", this.input_elements_arr[i].getAttribute("name") + this.autocompleteString);
        }
    }

    //remove the random characters from input names
    this.changeInputNamesBack = () => {
        for (var i = 0; i < this.input_elements_arr.length; i++) {
            this.input_elements_arr[i].setAttribute("name", this.input_elements_arr[i].getAttribute("name").replace(this.autocompleteString, ''));
        }
    }

    this.form_submit_override = (e) => {
        e.preventDefault()
        this.changeInputNamesBack()
        e.currentTarget.submit()
        return true
    }

    this.setup_form = () => {
        //get all the inputs in the form
        this.input_elements_arr = document.querySelectorAll("input");
        this.changeInputNames();
        this.add_submit_handlers();
    }

    //make sure script calls function after page load
    this.init = () => {
        if (document.readyState === "complete") {
            this.setup_form()
        } else {
            let setup_form = this.setup_form
            document.addEventListener("DOMContentLoaded", function (e) {
                setup_form()
            })
        }
    }
}

在需要它的页面上

<script>
    af = new stop_autofill()
    af.init()
</script>