2013-02-24 86 views
2

我有非常简单的电子邮件发送表单,只有一个电子邮件字段和一个textarea。jQuery ajax()/ post()&成功

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)只是做基本的电子邮件和文本区域的检查,然后用电子邮件()发送它(如果有效)。

我面临的问题是,即使在发送错误数据/所有字段为空时,警报消息“哟”也会显示。

任何想法如何解决这个问题?有什么办法可以“告诉”ajax输入失败时,并从我的send.php文件成功?

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

+0

我的不好的,修正的例子。 – Wordpressor 2013-02-24 04:02:49

回答

1

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

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

一般来说,您最好在使用AJAX的情况下查看一些其他示例,无论是否使用jQuery。特别是,http://api.jquery.com/jQuery.ajax/会有一定用处。

+0

这正是我正在寻找的,我发现在jQuery文档中,成功获得了三个参数,但我不知道如何通过我的php文件响应非200“OK”HTTP状态? – Wordpressor 2013-02-24 04:00:35

+0

@Wordpressor - 你可以用这种或那种方式来做到这一点(我提到过) - 但是如果你选择让PHP返回一个非成功的状态(有时候会导致误导),请参阅http://php.net/manual /en/function.http-response-code.php。 – ziesemer 2013-02-24 04:03:07

+0

感谢,作品像一个魅力,我一直在浏览jQuery api文档一段时间了,但是这个解释不够好(当谈到JS时,我只是一个新手),不知道该怎么去一个描述状态的字符串。非常感谢您的澄清。 – Wordpressor 2013-02-24 04:08:09

4

当您的服务器发送HTTP 200响应代码时,$ .ajax()的成功回调触发。 200是指:

  • 您的服务器接收到一个请求,optionaly数据
  • 它接受它
  • 它处理它
  • 就知道该怎么做吧
  • 它返回一个有效响应您的客户端(可选的,它可以发送一个空的机构)

因此,有2种方式,你可以这样做:

  1. 使您的服务器错误地返回非200 HTTP代码。例如400(错误的请求,如果这些参数没有被验证,那么可以争辩说)。这将触发错误回调$ .ajax()和而不是您的成功回调(你问了什么)
  2. 把错误处理放在应用程序逻辑而不是http层。这意味着,您将引入自己的约定来报告服务器响应中的应用程序级别错误。

为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()。您应该将该调用作为事件处理程序中的第一个条目。这将确保默认事件的确会被阻止,以防在你的函数的其他部分发生任何错误(导致它中止)。