如何在没有async = false的情况下执行jQuery阻止AJAX调用?

Chr*_*isV 14 validation ajax jquery html5 asynchronous

我有一个页面在继续下一页之前对电子邮件进行AJAX验证,使用HTML5 setCustomValidity()方法[使用旧浏览器的webshims库].

为此,我在$ .ajax()调用中将async选项设置为false以使其同步,阻止页面等待AJAX​​响应,否则表单在ajax调用返回之前提交,从而使验证无效.

<script>
  function validateEmailRegistered(input) {
    if (input.setCustomValidity === undefined) return;
    var err = 'Email address not found';
    $.ajax({
      url: 'email-is-registered.php', 
      data: { email: input.value }, 
      async: false, 
      success: function(data) {
        var ok = data=='true';
        input.setCustomValidity(ok ? '' : err)
      }
    });
  }
</script>

<form method="get" action="nextpage.php">
  <input name="email" id="email" type="email" required
    onChange="validateEmailRegistered(this)">
  <button type="submit">go</button>
<form>
Run Code Online (Sandbox Code Playgroud)

我发现从jQuery 1.8开始就不推荐使用async选项.

如果没有async选项,如何实现此阻止操作?

小智 10

http://bugs.jquery.com/ticket/11013#comment:40

1.8中已弃用同步ajax请求中的Deferred/Promise功能.支持使用async:false的$ .ajax方法,但必须使用回调参数而不是Promise方法,例如.then.done.

因此,如果您使用的是success/complete/error处理程序,您仍然可以使用async:false.更多信息在上面的jquery票.


Jon*_*col 0

我假设您无论如何都会在提交时进行完整的表单验证,所以如果您键入的电子邮件验证被中断,并且优先考虑表单提交,也许这没有问题。

我认为我要做的是在用户提交表单时中止“validateEmailRegistered”AJAX 请求。然后,照常执行完整的服务器端表单验证 - 包括电子邮件验证。

我对键入时验证的理解是,它是一种很好的功能,不能替代提交表单时对其进行验证。所以它阻止表单提交对我来说没有意义。