我想要做的就是在提交之前检查表单中的某些值(名称,电子邮件)是否已经存在于数据库中。
我有一个运行良好的PHP脚本并返回与问题相对应的字符串,或者"没有输出"万一没有错。
我遇到的唯一问题是使用event.preventDefault(),只有在php脚本返回" no output"以外的内容时才应该调用它。 当它在get()调用中并且我尝试使用if语句时,它不起作用,无论错误div是否为空,但它也没有工作。
$(document).ready(function() {
$( "#signupForm" ).submit(function( event ) {
$.get( "signupchecker.php", { name: $('#name').val(), email: $('#email').val() } ).done(function ( data ) {
if( data != "no output" ) {
$( "#error" ).text( data );
}
});
event.preventDefault();
});
});
谢谢!
答案 0 :(得分:4)
我唯一的问题是使用event.preventDefault(),只有在php脚本返回“无输出”以外的内容时才应调用它。
你无法合理地这样做。您必须使用同步ajax请求,在执行网络操作时锁定浏览器的UI,而可能是非常差的UX。 (最终将不再受jQuery的支持。)
相反,始终阻止默认值,如果PHP脚本返回一个值,表示允许提交表单,请在submit
上调用DOMFormElement
(直接,而不是通过jQuery)。这将提交表单而不再运行submit
事件处理程序。
,例如:
$(document).ready(function() {
$("#signupForm").submit(function(event) {
var thisForm = this; // Remember the raw form element
$.get("signupchecker.php", {
name: $('#name').val(),
email: $('#email').val()
}).done(function(data) {
if (data != "no output") {
$("#error").text(data);
} else {
thisForm.submit(); // Submit form w/o calling submit event handlers again
}
});
event.preventDefault(); // Always do this
});
});
请注意,由于这意味着您只是将表单作为用户启动操作的间接结果提交,因此如果表单的target
设置为打开一个新窗口,您可以与弹出窗口拦截器发生冲突。 (你也可能没有。:-)浏览器可以看到XHR是由用户事件发起的,表单提交是在XHR完成时完成的,所以它可以决定它没问题......)