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() 发送它们(如果它们经过验证)。

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

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

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

4

2 回答 2

4

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

  • 您的服务器收到一个请求,可选数据
  • 它接受了
  • 它处理了它
  • 它知道如何处理它
  • 它向您的客户返回了一个有效的响应(可选,它可以发送一个空的正文)

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

  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!);
        }
    }); 
});

One more thing: if you intend to do a preventDefault() in all cases. You should put that call as the first entry in your event handler. That will ensure the default event will indeed be prevented, in case any error occurs in the rest of your function (causing it to abort).

于 2013-02-24T04:17:42.443 回答
1

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

您会发现,如果您在success函数中接受一个参数,例如 `success: function(o)',那么来自 AJAX 调用的响应的属性将有助于执行此操作。

通常,您最好查看一些使用 AJAX 的附加示例,包括使用和不使用 jQuery。 http://api.jquery.com/jQuery.ajax/特别有用。

于 2013-02-24T03:58:51.943 回答