使用 AJAX 调用时如何存储到浏览器自动完成/自动填充

Posted

技术标签:

【中文标题】使用 AJAX 调用时如何存储到浏览器自动完成/自动填充【英文标题】:How to store to browser auto-complete/auto-fill when using AJAX calls 【发布时间】:2012-03-01 09:24:44 【问题描述】:

我注意到浏览器在提交表单之前不会存储表单值,这意味着如果您使用 AJAX 而不是标准表单提交,则永远不会填充浏览器的自动填充。有没有办法强制填充您的浏览器自动填充/自动完成,以便我可以通过 AJAX 提交的表单获得这种便利?访问我的 AJAX 页面,每次都必须在表单字段中输入相同的内容,因为浏览器不记得它们,这很烦人。

我的问题与this one 几乎相同,只是只提供了 FireFox 中的解决方法作为该问题的公认答案。我正在寻找一种适用于所有主流浏览器(至少 Chrome、FF 和 IE)的解决方案,如果有的话。

注意:我不是在谈论 AJAX 自动完成插件,这是在谷歌搜索这个问题时几乎总是会弹出的。我说的是您的浏览器内置的自动完成或自动填充功能,它通过记住您过去输入的内容来帮助您填写表格。

【问题讨论】:

你能提交到 javascript: URI 吗? 这在 AJAX 表单中是一个如此巨大的问题,我发现令人震惊的是,在网络上或任何有效的跨浏览器解决方案中关于它的信息如此之少。谁知道呢,也许那里有资源,但正如您提到的,很难浏览所有关键字如此相似的自动完成插件内容。编辑:刚刚看到这是在 2012 年发布的。我们在 2 年后没有任何进展 在这里回答...***.com/questions/15462991/… 【参考方案1】:

对于仍在尝试解决此问题的任何人,我好像找到了answer。

Chromium 会尝试识别提交事件,即使您阻止默认并自己处理实际提交也是如此。

就是这样,你需要preventDefault提交事件,不是点击事件。

在撰写本文时,这适用于 Chrome、Edge 和 IE 11(我懒得在 Firefox 上下载和测试它)。 这是您的表格:

<form method="POST" id="my-form">
  <label>Email</label>
  <input autocomplete="email" type="email" name="email">
  <button type="submit">Subscribe</button>
</form>

注意autocomplete 属性。这些是您可以用于autocomplete 的所有possible values。

在 JavaScript 中,只需这样做:

$("#my-form").on("submit", function (ev) 
  ev.preventDefault();

  // Do AJAX stuff here
);

浏览器会记住您在点击订阅按钮时输入的任何电子邮件。

【讨论】:

【参考方案2】:

我也遇到过这个;似乎没有一个很好的解决方案,当然不是跨浏览器的解决方案,但这里有一个我没有看到任何人提到的 IE:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<SCRIPT>
function subForm()

window.external.AutoCompleteSaveForm(f1);
f1.submit();

</script>
</HEAD>
<BODY>
<FORM id=f1>
User ID : <input type=text name=id></input><br>
Password :<input type=password name=pw></input><br>
E-mail :<input type = text VCARD_NAME = "vCard.Email"> <br>
<input type=button value=submit onclick="subForm()">
</FORM>
</BODY>
</HTML>

发件人:http://support.microsoft.com/kb/329156

【讨论】:

【参考方案3】:

您是否尝试过您提到的我的问题的答案? 答案是使用隐藏的 iframe,但似乎他声称这个想法当时不适用于 IE 和 Chrome。

尝试接受这个想法,而不是使用隐藏的 iframe,只需将用户名/密码/提交可见输入元素放在一个表单 POST 中,在一个 iframe 中。因此,用户将直接在 iframe 中输入登录详细信息。使用适当的 Javascript,您可以放置​​加载图像,从服务器获取成功或拒绝,并更新父页面或整个页面。我相信它应该适用于任何浏览器。

或者如果您仍然想使用 AJAX,因为您可能在服务器端实现了 API。您可以让 iframe 仅发送一个虚拟 POST,同时将真实用户/密码发送到 AJAX URL。

或者返回使用隐藏的iframe,不是隐藏它而是将它移动到像top: -1000px这样的不可见区域。

【讨论】:

我也遇到了同样的问题,请问您找到解决办法了吗? 我没有测试,但是使用iframe有什么问题吗?请与读者分享您的问题。 Chrome 46 修复了它的错误行为 - 不再需要 iframe 变通方法。见***.com/a/33113374/810109【参考方案4】:

使用这个方法:

AutoCompleteSaveForm = function(form)
    var iframe = document.createElement('iframe');
    iframe.name = 'uniqu_asdfaf';
    iframe.style.cssText = 'position:absolute; height:1px; top:-100px; left:-100px';
    document.body.appendChild(iframe);
    var oldTarget = form.target;
    var oldAction = form.action;
    form.target = 'uniqu_asdfaf';
    form.action = '/favicon.ico';
    form.submit();
    setTimeout(function()
        form.target = oldTarget;
        form.action = oldAction;
        document.body.removeChild(iframe);
    );

用ie10、ff最新、chrome最新测试

测试自己:http://jsbin.com/abuhICu/1

【讨论】:

这会像地狱一样消耗带宽,数据交换甚至没有用。 我认为这是唯一的解决方案。是的,它会发送整个表单,但在后台。 无论是否是隐藏任务,它都不会比淹没服务器的死请求少。我希望 Ajax 很快就会有更好的解决方案。 遗憾的是,这在基于 webkit 的浏览器中不起作用(不再):Opera 30、GC 43、Safari 5.1.7 它适用于我的 chrome:43.0.2357 和 45.0.2448.0 canary【参考方案5】:

经过几个小时的搜索,我在Trigger autocomplete without submitting a form 找到了解决方案。

基本上,它在同一页面中使用隐藏的 iframe,将表单的操作设置为 iframe 的“src”,并在表单内添加隐藏的提交按钮,当用户单击触发 AJAX 请求的按钮时,您应该在发送 AJAX 请求之前以编程方式单击隐藏按钮。见下面的例子:

在您的表单页面中:

<iframe id="hidden_iframe" name="hidden_iframe" class="hidden" src="/content/blank"></iframe>
<form target="hidden_iframe" method="post" action="/content/blank" class="form-horizontal">
    <input type="text" name="name">
    <input type="text" name="age">
    ....
    <button id="submit_button" type="submit" class="hidden"></button>
    <button id="go_button" type="submit" class="hidden">Go</button>
</form>

然后是java脚本:

$('#go_button').click(function(event)
    //submit the form to the hidden iframe
    $('#submit_button').click(); 
    //do your business here
    $.ajax(function()
        //whatever you want here
    )
);

希望这会有所帮助。

【讨论】:

以上是关于使用 AJAX 调用时如何存储到浏览器自动完成/自动填充的主要内容,如果未能解决你的问题,请参考以下文章

如何根据从 ajax 调用返回的数据动态地将选项添加到我的自动完成功能?

jQuery 自动完成嵌套 Ajax 调用

AJAX调用会阻止导航到其他页面,直到完成为止

使用 setTimeout 定期进行自动完成 AJAX 调用?

如何在递归的AJAX调用中提供“解决”,以便我可以使用“完成”?

如何将标题添加到 jqueryui 自动完成调用?