我有一个通用的AJAX表单提交JS类:
$(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$('.ajax-form').submit(function() {
var form = $(this);
var url = form.attr('action');
var data = form.serialize();
if (!form.hasClass('valid')) {
$.ajax({
url: url,
type: 'post',
data: data,
dataType: 'json',
success: function(result) {
$('.field').removeClass('has-error');
form.addClass('valid');
form.submit();
},
error: function(result) {
var errors = result.responseJSON;
$('.field').removeClass('has-error');
$.each(errors, function(key, value) {
var field = $('.field.' + key);
field.addClass('has-error').children('.error-message').text(value[0]);
});
}
});
return false;
}
});
});
这适用于所有表单上的AJAX验证 . 我现在正尝试在使用auth脚手架( resources/views/auth/passwords/email.blade.php
)生成的默认"forgot password"表单上实现此功能 .
<form class="ajax-form" method="POST" action="{{ route('password.email') }}">
...
</form>
虽然AJAX验证在这里工作,但我遇到的问题是,当验证通过时,它还执行“忘记密码”功能 . 所以基本上它发送重置密码电子邮件两次(一次在AJAX提交期间,一次在正常表单提交期间) .
我只希望AJAX提交执行验证 . 如果验证成功,它应该(正如目前所做的那样)执行将发送电子邮件的正常表单提交 .
3 回答
您是否希望保持Ajax提交但删除正常表单提交?如果是,那么假设您有一个提交表单的按钮,您可以在此答案中保持表单提交:Want html form submit to do nothing
如果我正确理解了该问题,您需要阻止表单默认行为并验证,如果所有内容都经过验证,请恢复默认表单行为以提交数据 .
这是解决此问题的正确方法 . 在
Auth\ForgotPasswordController
中覆盖sendResetLinkEmail
函数,如下所示:通过执行
if ($request->ajax())
,我们允许它检查ajax请求并仅返回json响应 . 然后在后续请求中,当它执行常规表单发布时,它将执行忘记密码功能 .