jQuery ajax()/ post()&成功

时间:2013-02-24 03:56:21

标签: jquery ajax forms post

我有一个非常简单的电子邮件发送表单,只有一个电子邮件字段和一个textarea。

jQuery('#contact').validator().submit(function(e){
    $.ajax({
      type: "POST",
      url: this.action,
      data: { 
        mail: $('input[name="mail"]').val(), 
        message: $('textarea[name="message"]').val(), },
      success: function(){
                alert('yo');
               }
     }); 
     e.preventDefault();
});

我的操作文件(send.php)只进行基本的电子邮件和textarea检查,然后使用mail()发送它们(如果已经过验证)。

我面临的问题是即使我发送错误的数据/所有字段都是空的,警告信息“yo”也会显示。

任何想法如何解决?当输入失败并且从send.php文件成功时,有什么方法可以“告诉”ajax吗?

我正在使用jQuery Tools Validator来验证字段,我知道有onSuccess操作,但在我的情况下不能使用那个。

2 个答案:

答案 0 :(得分:4)

当服务器发送HTTP 200响应代码时,$ .ajax()上的成功回调会触发。 200表示:

  • 您的服务器收到了一个请求,其中包含数据
  • 它接受了它
  • 它处理它
  • 它知道如何处理它
  • 它向您的客户返回了有效的回复(可选,它可以发送一个空的身体)

所以有两种方法可以做到这一点:

  1. 使您的服务器在出错时返回非200 HTTP代码。例如400(错误的请求,如果参数不验证,可以认为是这样)。这会触发$ .ajax()的错误回调和你的成功回调(你问的是什么)
  2. 将错误处理放在应用程序逻辑中而不是http层。这意味着,您引入自己的约定来报告服务器响应中的应用程序级错误。
  3. 对于2,这里有可能的json响应(由你来决定你想要的任何约定)

    // in case of success:
    {status: 'ok', error: {errno: 0, msg: ""}}
    
    // in case of error:
    {status: 'fail, 'error: {errno: 1, msg: "invalid parameters"}}
    

    然后在你的ajax调用中相应地处理响应

    jQuery('#contact').validator().submit(function(e)
    {
        e.preventDefault();
        $.ajax(
        {
            type: "POST",
            dataType: 'json',
            url: this.action,
            mail: $('input[name="mail"]').val(), 
            message: $('textarea[name="message"]').val(),
            success: function(data)
            {
                 if (data && data.error && data.errorno)
                 {
                       // there is an application-level error. Hande it.
                       // ...
                       return;
                 }
                 alert('yo!);
            }
        }); 
    });
    

    还有一件事:如果你打算在所有情况下都做一个preventDefault()。您应该将该调用作为事件处理程序中的第一个条目。这将确保确实会阻止默认事件,以防函数的其余部分发生任何错误(导致其中止)。

答案 1 :(得分:1)

您需要让PHP以非200“OK”HTTP状态响应,或者检查PHP正在响应的消息,并相应地更改逻辑。

您会发现,如果您接受success函数中的参数,例如`success:function(o)',来自AJAX调用的响应属性将有助于这样做。

一般情况下,使用AJAX查看一些其他示例(包括和不使用jQuery)都会做得很好。特别是http://api.jquery.com/jQuery.ajax/会有所帮助。