jQuery ajax() / post() & success

3

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

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)只进行基本的电子邮件和文本区域检查,然后使用mail()发送它们(如果它们通过验证)。
我面临的问题是,即使我发送了错误的数据/所有字段都为空,警报消息“yo”也会显示。
有什么解决办法吗?是否有任何方法可以从我的send.php文件中“告诉”ajax何时输入失败和何时成功?
我正在使用jQuery Tools Validator来验证字段,我知道有onSuccess操作,但在我的情况下无法使用。

我的错,已修正示例。 - Wordpressor
2个回答

4
当你的服务器发送HTTP 200响应代码时,$.ajax()中的成功回调将被触发。200表示:
- 您的服务器收到了请求(可以带数据) - 它接受了请求 - 它对请求进行了处理 - 它知道该怎么做 - 它向您的客户端返回了有效的响应(可选,它也可以发送空正文)
所以你有两种方法可以做到这一点:
1. 使你的服务器在错误时返回非200的HTTP代码。例如400(坏请求,如果参数无效则可以争辩)。这将触发$.ajax()的错误回调,而不是您要求的成功回调。 2. 在应用程序逻辑中处理错误,而不是在http层处理。这意味着您引入自己的约定来报告服务器响应中的应用程序级错误。
对于第二种方法,以下是可能的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
你需要让你的PHP响应一个非200 "OK" HTTP状态码,或者检查你的PHP响应的消息,并相应地更改你的逻辑。如果在success函数中接受一个参数,例如 `success: function(o)',你会发现从AJAX调用返回的响应有一些属性可用于辅助完成此操作。通常情况下,你最好查看一些使用AJAX的其他示例,包括使用和不使用jQuery的示例。其中http://api.jquery.com/jQuery.ajax/将特别有用。

这正是我正在寻找的,我在jQuery文档中发现success会传递三个参数,但我不知道如何通过我的php文件响应非200“OK”HTTP状态? - Wordpressor
@Wordpressor - 你可以选择其中一种方式(我都提到了)- 但是如果你选择让PHP返回一个非成功状态(有时可能会误导),请参考http://php.net/manual/en/function.http-response-code.php。 - ziesemer
谢谢,非常好用,我已经浏览了一段时间的jQuery api文档,但这并没有解释得足够清楚(而且当涉及到JS时,我只是一个新手),对于“描述状态的字符串”我毫无头绪。非常感谢您澄清了这个问题。 - Wordpressor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接