必须点击提交两次AJAX请求才能触发表单提交
Have to click submit twice for AJAX request to fire on form submission
My Form HTML如下所示。
<form novalidate action="register.php" method="post" >
<label for="username">Username</label>
<input type="text" name="username" required placeholder="Your username" autofocus/>
<input type="submit" name="register" value="Register" cid="submit" />
</form>
我的jQuery看起来像这个
$("form").submit(function(e) {
var $form = $(this);
var serializedData = $form.serialize();
request = $.ajax({
url: "check.php",
type: "post",
data: { formData: serializedData },
datetype: "JSON"
});
request.done(function(response, textStatus, jqXHR) {
console.log("HELLO");
$('form').unbind();
$('form').submit();
});
e.preventDefault();
});
可悲的是,它将hello
记录到控制台,但它从未通过单击提交按钮提交表单。我需要按两次才能提交按钮。
有人能告诉我这个问题吗?我该如何解决它,这样一次点击就足够提交表格了。
注:表格中的数据是为了验证而发送的,而不是为了提交。如果电子邮件、用户名等数据是有效的,我希望表单可以一键提交。
尝试将验证与表单提交分离。
只需更改此行:
$("form").submit(function(e) {
至
$("input[name='register']").click(function(e) {
首先,我认为使用success函数而不是.done((函数会更干净。例如:
$("form").submit(function(e) {
e.preventDefault();
var $form = $(this);
var serializedData = $form.serialize();
request = $.ajax({
// Merge the check.php and register.php into one file so you don't have to 'send' the data twice.
url: "register.php",
type: "post",
data: { formData: serializedData },
datetype: "JSON",
success: function() {
console.log("This form has been submitted via AJAX");
}
});
});
请注意,我删除了.ubind((函数,因为我怀疑这可能是您的代码出现问题的原因。它从表单中删除事件处理程序,而不管它们的类型如何(请参阅:http://api.jquery.com/unbind/)。此外,我还将e.preventDefault((放在了开头。我建议您尝试这段经过编辑的代码,并告诉我们它是否有效。
编辑:哦,是的,当你通过AJAX发送数据时,你不需要提交它。
试试这个。
$("form").submit(function(e) {
var $form = $(this);
var serializedData = $form.serialize();
request = $.ajax({
url: "check.php",
type: "post",
data: { formData: serializedData },
datetype: "JSON"
});
request.done(function(response, textStatus, jqXHR) {
console.log("HELLO");
$('form').unbind();
$('form').submit();
});
});
$("form").submit(function(e) {
e.preventDefault();
var $form = $(this);
var serializedData = $form.serialize();
$.ajax({
url: "check.php",
type: "post",
data: { formData: serializedData },
datatype: "JSON",
success: function(data) {
return data;
}
});
});
所以,把它分解。
使用preventDefault((停止表单提交。
获取表单数据并将其提交给验证器脚本。
我认为返回值是一个布尔值。如果它被验证,它将是真的,或者是假的。
返回将继续提交或结束表单的值。
注:这是一种糟糕的验证表单的方法。我会在服务器上通过表单提交来验证我的表单,因为javascript非常容易被篡改。从强制服务器发出真正的响应到关闭提交事件侦听器的所有操作。
一旦我遇到同样的问题我发现我的url xxx.php中有一些错误它可能会返回错误消息,如"注意:xxx.php中的未定义变量:j在第..行"它可能会让ajax以意想不到的方式运行。仅供参考。
单击提交按钮时,您可以创建一个普通按钮并在单击该按钮时激发一个函数,而不是执行阻止默认操作,在该函数结束时,使用$('#form').submit();
提交表单。不再有令人困惑的防止默认。
您不需要调用submit()
,因为您是通过ajax发布数据的。
EDIT您可能需要根据需要调整contentType
和/或其他ajax参数。PHP示例非常基础。你的表格很可能要复杂得多。此外,您还需要清理任何php数据——不要只依赖$_POST
jQuery:
$("form").submit(function(e) {
$.ajax({
'type': 'post',
'contentType': 'application/json',
'url': 'post.php',
'dataType': 'json',
'data': { formData: $(this).serialize},
'timeout': 50000
).done(function(data) {
// Response from your validation script
if (data === true)
{
// SUCCESS!
}
else
{
// Something happened.
}
).fail(function(error) {
console.log(error);
});
e.preventDefault();
});
PHP
$is_valid = FALSE;
$name = $_POST['name'];
if ($name !== '')
{
$is_valid = TRUE;
}
else
{
return FALSE;
}
if ($is_valid)
{
// insert into db or email or whatver
return TRUE;
}
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- node.js请求数据事件未在CORS ajax调用中触发
- jQuery Ajax GET请求工作不正常
- "日期“;AJAX请求返回的类型值未定义
- Django - 响应请求 AJAX
- 使用 jQuery 的 CORS 请求 - $.ajax()
- 如果无线电值为 ==1,则请求 ajax
- 如何处理对循环中发出的多个异步请求(AJAX 调用)的响应
- POST请求ajax jquery错误
- CasperJS don'我没有请求AJAX
- 使用这种Facebook风格的Lightbox-请求AJAX-在一个页面上覆盖多个按钮
- 400错误请求ajax post请求
- 如何在开始发送请求ajax之前延迟3秒
- 与jQuery同时请求AJAX
- 使用POST请求AJAX发送json对象