使文本输入字段记住先前输入的数据

29

我的文本输入框似乎无法记忆之前输入的值。例如,许多网站我甚至没有账户,但在输入我的电子邮件地址(作为“访客”购买火车票)之前,它们会给我一个下拉菜单,列出了我过去使用过的电子邮件地址。然而我的表单却没有这样做。每次都要完全手动输入。这似乎与此问题相反...

我有简单的输入框,如 <input type="text" id="firstName" placeholder="名字" />

它们通过简单的 jQuery Ajax 提交。类似于这个。然而,在 jsbin 上这个例子中的 Ajax 并不起作用,我只是展示它来演示我的基本结构。是否有jQuery插件可以实现此功能?是否有一种方式可以控制这看似由浏览器驱动的行为?


2
许多我甚至没有账户的网站。这些网站不会记住这些值,而是由浏览器记住。 - Adil Shaikh
正如您所了解的那样,它是由浏览器驱动的。我认为当您的浏览器设置不允许时,您无法做任何事情。 - hop
9个回答

21

我曾经遇到了同样的问题。对我来说,这是在开发ASP.NET MVC时出现的。无论如何,我必须做出的解决方案是一个组合:

  1. 在我的输入标记中定义名称属性

  2. 在我的输入标记中设置autocomplete="on"

  3. 将按钮标记更改为type="submit"标记

  4. 将所有输入控件封装在<form>标记中


在Firefox中,直到我按照所有这些步骤操作后才能使其正常工作。最高得票的答案还不够。值得一提的是,我正在制作一个单页面应用程序。 - Daniel Kaplan

19
在大多数浏览器中,您可以通过给输入框命名的方式来使浏览器显示先前输入过的值。例如:
<input type="text" id="firstName" placeholder="First name" name="firstName" >
如果表单没有name属性,浏览器将不会显示建议内容。
还要检查JavaScript是否阻止提交的默认操作。

4
还是真的吗?现在浏览器好像有更多的启发式方法来自动填充。 - gaurav5430

4

有些浏览器坚决不会记住输入内容,除非我通过(滥用)localStorage手动“记住它”... 对我而言,这种方法奏效:

    {
        // hack to remember last error id on page refresh
        // can't believe i have to do this, but my browser don't want to remember it itself, 
        // ... not sure why
        let errorid_element=document.querySelector("#errorlog_id");
        let rememberHack=function(){
            localStorage.setItem("last_id_remember_hack",errorid_element.value);
        };
        errorid_element.addEventListener("input",rememberHack);
        errorid_element.addEventListener("change",rememberHack);
        errorid_element.value = localStorage.getItem("last_id_remember_hack");
    }

2
这是一个稳定可靠的解决方法 =) - user3405291
1
@user3405291 在我的经验中,确实比其他人推广的“自动完成”属性更可靠。 - hanshenrik

2

根据浏览器和用户隐私设置以及排序方式,可能会有所不同,但默认情况下应该是开启的,您可以尝试在输入标签中添加 autocomplete="on"


2
自动完成(autocomplete)应该是默认设置。如果浏览器不记住,我们无法覆盖它。 - hop
规范说明默认为开启状态 - http://dev.w3.org/html5/spec-author-view/common-input-element-attributes.html#the-autocomplete-attribute - hop
输入字段的默认autocomplete值为开启状态,因此设置此属性实际上不会有任何影响。这个设置是由浏览器驱动的。如果用户在浏览器中的设置不允许记住自动完成值,则您添加、更改、修改、改变、创建等操作都无法改变这一点。用户需要更新他们的浏览器设置才能允许此功能。 - War10ck
1
这对我有用。我使用的一个框架可能已经关闭了它。感谢您即使得分为负也保持答案的更新。 - Anonymous1

0

如果你正在使用React

  • 给每个输入框添加一个名称
  • <form>标签包裹起来
  • 防止默认的表单提交行为
  • 在任何提交按钮上添加type="submit",不要包含onClick。让onSubmit回调函数处理它。

现在按下回车键或点击按钮将会记住输入的值。

<form onSubmit={(e) => {
        e.preventDefault(); // prevent new page from being opened
        // do something with input data
     }
}>
    <input name="myInput" ... />
    <button type="submit" ... />
</form>

https://reactjs.org/docs/forms.html


0
以下内容对我很有效。我复制并粘贴了重要的部分,所以你可能需要稍微调整一下才能让它适用于你,但它应该基本上“只需运行”。
$(function(){
  function save_user_inputs(ev){
    $("input").each(function(index, $input){
      if ($input.name == ""){
        return true;
      }       
      localStorage.setItem("input." + $input.name, $input.value);
    }); 
    return true;
  } 

  function load_user_inputs(){
    var input_names = Object.keys(localStorage);
    for(var i=0; i<input_names.length; i++){
      var input_name = input_names[i];
      if (!input_name.startsWith("input.")){
        continue;
      }   
      var $input = $("[name='"+input_name.split(".")[1]+"']")
      $input.val(localStorage[input_name]);
    }   
  } 
        
  $(document).on('submit', save_user_inputs);
  load_user_inputs();
});

0
在Bootstrap中,你需要填写 ''for=' '字段。
例如:
    <div class="custom-control custom-checkbox checkbox-lg">
      <input type="checkbox" class="custom-control-input" id="TER" value="TER">
      <label class="custom-control-label" for="TER">Land/Lot</label>
    </div>

请注意forid值是匹配的


-4

您可以尝试使用 autocomplete="on"

<input type="text" id="firstName" placeholder="First name" autocomplete="on" />

1
这取决于浏览器。规范说明默认为开启 - http://dev.w3.org/html5/spec-author-view/common-input-element-attributes.html#the-autocomplete-attribute - hop
@thomas 检查你的浏览器自动完成设置。你使用的是哪个浏览器? - hop
输入字段的默认autocomplete值为开启状态,因此设置此属性实际上不会有任何影响。这个设置是由浏览器驱动的。如果用户在浏览器中的设置不允许记住自动完成值,则您添加、更改、修改、改变、创建等操作都无法改变这一点。用户需要更新他们的浏览器设置才能允许此功能。 - War10ck

-6
将属性autocomplete="off"添加到您的输入框中。

2
这个问题已经快五年了。而且你的解决方案显然与期望的行为完全相反。 - 1252748

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接