Javascript 触发自动完成而不提交表单
我正在编写一个非常简单的web应用程序,有三个文本输入。输入用于生成结果,但所有工作都是在Javascript中完成的,因此无需提交表单。我正试图找到一种方法,让浏览器存储输入值,以便自动完成,就像它们以提交的形式存在一样 我曾尝试手动输入autocomplete=“on”,但由于没有要提交的表单,浏览器无法知道何时应该存储值,因此这没有任何效果 我还尝试将输入包装到一个具有onSubmit=“return false;”的表单中,但阻止表单实际提交似乎也会阻止浏览器存储其输入值Javascript 触发自动完成而不提交表单,javascript,html,forms,Javascript,Html,Forms,我正在编写一个非常简单的web应用程序,有三个文本输入。输入用于生成结果,但所有工作都是在Javascript中完成的,因此无需提交表单。我正试图找到一种方法,让浏览器存储输入值,以便自动完成,就像它们以提交的形式存在一样 我曾尝试手动输入autocomplete=“on”,但由于没有要提交的表单,浏览器无法知道何时应该存储值,因此这没有任何效果 我还尝试将输入包装到一个具有onSubmit=“return false;”的表单中,但阻止表单实际提交似乎也会阻止浏览器存储其输入值 当然可以手动使
当然可以手动使用localStorage或cookie来持久化输入,然后从中生成自动完成提示,但我希望找到一种利用本机浏览器行为而不是手动复制的解决方案。我还没有测试过这一点,但如果将表单提交到隐藏的iframe,它可能会起作用(这样就可以实际提交表单,但不会重新加载当前页面)
...
根据我搜索的内容。似乎您需要识别名称。一些标准名称,如“姓名”、“电子邮件”、“电话”、“地址”会自动保存在大多数浏览器中
问题是,浏览器处理这些名称的方式不同。例如,chrome的正则表达式:
- 名字:“first.*名字|缩写| fname | first$”
- 电子邮件:“电子邮件”
- 地址(第1行):“地址。*第1行|地址1 |地址1 |街道”
- zipcode:“邮政编码|邮政编码|邮政编码|邮政编码| ^1z$”
自动完成
,因此您可以自定义名称并输入自动完成类型,但我相信这不适用于自定义字段
这是IE、Opera和Mozilla中的另一件事。现在,你可以在那里尝试iframe解决方案,这样你就可以提交它了。(可能是半标准的东西)
好的,这就是我所能帮助的。也许你可以使用它……这是一个自动完成的非常完整的实现,带有本地和远程预取,它利用本地存储来持久化结果,并且在输入元素中显示提示……代码很容易理解,如果你不想使用完整的jquery插件,我想你可以可以查看代码以了解如何实现您想要的…当focusout和focusin自动完成时,可以使用jQuery将自动完成数据持久化到localstorage中的持久值 i、 e
您还可以根据您的应用程序要求在其他事件上绑定持久性逻辑。使用Chrome、IE和Firefox测试:
<iframe id="remember" name="remember" class="hidden" src="/content/blank"></iframe>
<form target="remember" method="post" action="/content/blank">
<fieldset>
<label for="username">Username</label>
<input type="text" name="username" id="username" value="">
<label for="password">Password</label>
<input type="password" name="password" id="password" value="">
</fieldset>
<button type="submit" class="hidden"></button>
</form>
用户名
密码
在Javascript中触发提交,例如$(“表单”)。提交();
$(“#提交按钮”)。单击()
(根据注释更新)
您需要在/content/blank处返回一个空白页面,以便获取和发布(关于:blank不适用于我,但适用于YMMV).确保您通过POST提交表单。如果您通过ajax提交表单,请执行
,省略操作
属性。我们知道,浏览器仅在提交表单时保存其信息,这意味着我们不能使用返回false
或e.preventDefault()取消表单
我们能做的就是让它在不重新加载页面的情况下将数据提交到任何地方。我们可以使用iframe
<iframe name="For those who would rather not change their existing form functionality, you can use a second form to receive copies of all the form values and then submit to a blank page before your main form submits. Here is a fully testable HTML document using JQuery Mobile demonstrating the solution.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile.structure-1.4.5.min.css" />
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>
<form method="post">
<input type="text" name="email" />
<input type="submit" value="GO" onclick="save_autofill(this);" />
</form>
<script>
function save_autofill(o) {
$(':input[name]', $('#hidden_form')).val(function () {
return $(':input[name=' + this.name + ']', $(o.form)).val();
});
$('#hidden_form').find("input[type=submit]").click();
}
</script>
<iframe name="hidden_iframe" style="display:none"></iframe>
<form target="hidden_iframe" id="hidden_form" action="about:blank" style="display:none">
<input type="text" name="email" />
<input type="submit" />
</form>
</body>
</html>
对于那些不想更改现有表单功能的用户,您可以使用第二个表单接收所有表单值的副本,然后在主表单提交之前提交到空白页。下面是一个使用JQuery Mobile的可完全测试的HTML文档,演示了解决方案
<iframe id="remember" name="remember" style="display:none;" src="."></iframe>
<form target="remember" method="post" action=".">
<input type="text" id="path" size='110'>
<button type="submit" onclick="doyouthing();">your button</button>
</form>
功能保存\自动填充(o){
$(':input[name],$('#hidden_form')).val(函数(){
返回$(':input[name='+this.name+']',$(o.form)).val();
});
$(“#隐藏形式”)。查找(“输入[type=submit]”。单击();
}
只需在主表单提交按钮上调用save\u autofill
函数即可。如果您有一个脚本函数提交表单,请将该调用放在save\u autofill
调用之后。对于主表单中的每个表单,您必须在hidden\u表单中有一个命名文本框
如果您的站点使用SSL,则必须将about:blank
的URL更改为https://about:blank
您可以在iframe src和form action中使用“.”
<form action="javascript:void(0)">
<input type="text" name="firstName" />
<button type="submit">Submit</button>
</form>
你的钮扣
---不带IFRAME---
您可以使用action=“javascript:void(0)”,而不是使用iframe,这样它就不会转到另一个页面,而autocomplete将存储这些值
提交
不确定我是否正确理解了这个问题。这是否意味着您将在浏览器中加载信息,以便javascript使用来自三个输入框的信息在一些预加载的数据中进行查找?我看到的一些自动完成实现使用Ajax加载结果。这不适合您的模型,是吗?在这里,尝试解决方案类似问题中提供的提示:@VKen我只是希望浏览器将输入视为已提交表单的一部分,因为用户将看到他们以前作为自动完成建议输入的值,而不实际提交表单。这听起来像是需要输入的历史记录。听起来像浏览器将表单输入保存到autosuggest/autocomplete。好吧,我们需要本地存储。这个插件很好。根据您的标准,没有本地存储,没有通过表单提交(ajax或类似)连接到服务器搜索,历史记录从何而来?这听起来像是一个更接近浏览器扩展的脱机应用,而不是
<iframe id="remember" name="remember" style="display:none;" src="."></iframe>
<form target="remember" method="post" action=".">
<input type="text" id="path" size='110'>
<button type="submit" onclick="doyouthing();">your button</button>
</form>
<form action="javascript:void(0)">
<input type="text" name="firstName" />
<button type="submit">Submit</button>
</form>