2013-02-24 4 views
2

У меня очень простая форма отправки электронной почты, только одно поле электронной почты и текстовое поле.jQuery ajax()/post() & success

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 проверки, а затем отправляет их с помощью почты() (если они подтверждены).

Проблема, с которой я столкнулся, заключается в том, что предупреждающее сообщение «yo» показывает, даже когда я отправляю неверные данные/все поля пустые.

Любые идеи, как исправить это? Есть ли способ, которым я могу «рассказать» ajax, когда входные данные завершаются с ошибкой, и когда это удается из моего файла send.php?

Я использую средство проверки jQuery Tools для проверки полей, я знаю, что есть действие onSuccess, но не могу использовать его в моем случае.

+0

Мой плохой, фиксированный пример. – Wordpressor

ответ

1

Вам либо нужно, чтобы ваш PHP ответил не-200 «ОК» HTTP-статус, либо просмотрел сообщение, на которое отвечает ваш PHP, и соответствующим образом измените вашу логику.

Вы обнаружите, что если вы принимаете аргумент в функции success, например. `success: function (o) ', есть свойства ответа от вызова AJAX, который поможет в этом.

В общем, вам следует рассмотреть некоторые дополнительные примеры, используя AJAX, как с jQuery, так и без него. http://api.jquery.com/jQuery.ajax/, в частности, будет полезен.

+0

Это именно то, что я ищу, я нашел в документации jQuery, что успех получает три аргумента, но я понятия не имею, как отвечать не-200 «ОК» HTTP-статус через мой php-файл? – Wordpressor

+0

@Wordpressor - вы можете сделать это так или иначе (я упомянул обоим), но если вы захотите, чтобы PHP возвращал статус неуспеха (который иногда может вводить в заблуждение), см. Http://php.net/manual /en/function.http-response-code.php. – ziesemer

+0

Спасибо, работает как шарм, я просматривал jQuery api docs какое-то время, но это недостаточно объяснено (и я просто новичок, когда речь заходит о JS), понятия не имел, куда идти 'строка, описывающая статус. Большое спасибо за разъяснение. – Wordpressor

4

успешный ответ на $ .ajax() триггеры, когда ваш сервер отправляет код ответа HTTP 200. 200 означает, что:

  • сервер получил запрос, опционально с данными
  • он принял его
  • он обработал его
  • он знал, что делать с ним
  • он вернул правильный ответ ваш клиент (по желанию, он может отправить пустое тело)

Итак, есть 2 способа вы можете сделать это:

  1. сделать ваш сервер возвращенным HTTP-кодом не-200 при ошибке. Например, 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"}} 

Затем обработать ответ соответственно в вашем АЯКС вызова

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() во всех случаях. Вы должны поместить этот вызов в качестве первой записи в обработчике событий.Это гарантирует, что событие по умолчанию действительно будет предотвращено, в случае возникновения какой-либо ошибки в остальной части вашей функции (что приведет к ее прерыванию).