我正在注册表单上触发ajax调用,其中我正在检查用户输入的电子邮件ID是否已被使用。 Ajax功能:
Jade:8
6| script(type='text/javascript', src='/assets/js/app.js')
7| {{ vm.massage }}
> 8| ul
9| li(ng-repeat='person in vm.person')
10| {{person.name}}
unexpected token "indent"
在上面的ajax函数中,如果响应为true,那么电子邮件ID已被使用,我需要显示一个错误div($(' #emaililerrorbecome')。slideUp();)和然后阻止表单提交。但即使event.preventDefault()也无效,导致emaild id再次注册。 请帮我解决一下这个。 TIA
答案 0 :(得分:4)
您应该以编程方式提交表单,并始终阻止jq提交处理程序中的默认行为。例如,使用上下文并调用submit()
DOM API方法:
$("#becomesignup").submit(function(event) {
event.preventDefault(); /* prevent form submiting here */
$.ajax({
context: this, /* setting context for ajax callbacks*/
url: 'login', // Your Servlet mapping or JSP(not suggested)
data: {
"email": $("#becomeemail").val()
},
type: 'GET',
dataType: 'html', // Returns HTML as plain text; included script tags are evaluated when inserted in the DOM.
success: function(response) {
if (response == "true") {
$('#emailerrorbecome').slideDown();
$('#become-submit').prop('disabled', true);
$('.black-screen').hide(); /* hide it here */
} else {
$('#emailerrorbecome').slideUp();
$('#become-submit').prop('disabled', false);
this.submit(); /* 'this' refers to the FORM, and calling submit() DOM native method doesn't fire again jq handler */
}
},
error: function(request, textStatus, errorThrown) {
alert(errorThrown);
}
});
});
有关为什么的说明,请参阅Quentin's answer
答案 1 :(得分:3)
submit
函数返回后,您无法阻止submit
。 Ajax结果发生得晚得多。
您可以改为标记提交(例如使用sentinel变量)并取消它,除非允许。然后从Ajax回调中的代码触发submit
。
var allowSubmit = false;
$( "#becomesignup" ).submit(function( event ) {
if (!allowSubmit){
$.ajax({
url : 'login', // Your Servlet mapping or JSP(not suggested)
data : {"email":$("#becomeemail").val()},
type : 'GET',
dataType : 'html', // Returns HTML as plain text; included script tags are evaluated when inserted in the DOM.
success : function(response) {
if(response == "true"){
$('#emailerrorbecome').slideDown();
$('#become-submit').prop('disabled', true);
// Enable next submit to proceed
allowSubmit = true;
// And trigger a submit
$( "#becomesignup" ).submit();
}else{
$('#emailerrorbecome').slideUp();
$('#become-submit').prop('disabled', false);
}
$('.black-screen').hide();
},
error : function(request, textStatus, errorThrown) {
alert(errorThrown);
}
});
}
// return false does e.preventDefault(), and true allows it to proceed
return allowSubmit;
});
答案 2 :(得分:2)
您正在致电preventDefault
迟到。
执行顺序是:
在阻止默认行为之前,您无法等待HTTP响应返回。
您需要始终阻止默认行为,然后在提交处理程序中使用JS有条件地重新提交表单,或者在使用Ajax执行测试时移动逻辑,这样它就不会出现问题。 ; t首先取决于表单提交事件(例如,一旦输入数据就运行它,并准备好在JS运行完毕之前表单可能被提交)。