触发event.preventDefault();只有满足条件 - Jquery / javascript

时间:2015-08-03 17:57:06

标签: javascript jquery

我想要做的就是在提交之前检查表单中的某些值(名称,电子邮件)是否已经存在于数据库中。

我有一个运行良好的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();
});

});

谢谢!

1 个答案:

答案 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完成时完成的,所以它可以决定它没问题......)