как обрабатывать ajax resonseText с условиями

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

Я получил свою форму для публикации с помощью ajax, и все работает хорошо. Что касается ajax, он успешно обработал свою работу с resonsetext. Но это не означает, что в моем случае все обработано правильно.

ajax публикует мою форму, которая запускает php-файл для вставки данных в мою базу данных. Успешно или неудачно, появится responseText, в котором либо будет сказано: «Спасибо», если все данные были вставлены в db, либо «Ошибка:», если это не удалось.

Как мне создать условие if из этого responseText для обработки такого рода пользовательской ошибки responseText? Или я могу заставить его возвращать .ajaxError() после responseText «Err:»?

HTML-форма:

 <form method="post" action="contact.php" id="contact">
    <fieldset>
        <input type="text" id="email" class="required email" name="email"  maxlength="30" value="youremail @ example.com" />
        <input type="text" id="subject" class="required" name="subject" maxlength="24" value="Enter your subject" />
        <textarea id="msg" class="required textarea" name="msg" cols="30" rows="5">Reason for contact.</textarea>
        <input type="submit" class="formBtn" value="Punch me an Email" />
    </fieldset>
</form>
  

jQuery:

 $(window).load(function(){
  $('#contact').ajaxForm({
        beforeSubmit:formValidate, 
        success: showResponse,
        clearForm:true
    }); 
});
function formValidate(){
    $('#contact').validate({
                rules:{
                    email:{required: true, email:true},
                    subject:{required: true, minlength: 5},
                    msg:{required: true, minlength: 50}
                },
                messages:{
                    email:'',
                    subject: '',
                    msg: ''
                },
                invalidHandler:function(){
                    $('div.error').hide();
                },
                focusInvalid:true,
                onfocusout:false,
                submitHandler: function() {
                    $('#contact').ajaxSubmit();
               }
            });
}
function showResponse(responseText,statusText,xhr,$form){
    console.log(responseText);
//    alert(responseText);
    // $("#contact").toggle('slow');
}
  

Комментарии:

1. Вот так. Извините, забыл вставить туда код.

Ответ №1:

Я бы предложил добавить dataType: 'json' свойство к вашему $.ajaxForm вызову. Тогда в вашем php вместо возврата «Спасибо» вы можете вернуть:

 return json(array('status'=>'success'));
  

или

 return json(array('status'=>'failed'));
  

Затем в show-response вы можете запустить что-то вроде :

 if(responseText.status === 'failed') { // do something })
  

Комментарии:

1. Это отлично работает, но мне пришлось распечатать его на php, чтобы получить Resonsetext. Если бы я сказал ему вернуть json_encode (массив), я бы ничего не вернул.

2. извините, я так привык работать с определенным фреймворком… Да, вам нужно распечатать его.. вам также может потребоваться установить соответствующий заголовок Content-type для JSON.

Ответ №2:

Вам нужно будет заставить ваш PHP отправлять строку ошибки таким образом, чтобы она отображалась в Resonsetext. Затем в вашем коде JavaScript вам придется интерпретировать эту строку ошибки. Это не будет ошибкой AJAX, потому что, насколько это касается AJAX, все работало прекрасно. AJAX не знает, что ваша программа обнаружила ошибку; он знает только, что отправил запрос и получил ответ обратно.

Другими словами: разделение полномочий и ответственности между AJAX и вашей программой означает, что AJAX не разрешается вмешиваться в работу вашей программы.

Комментарии:

1. Правильно, так что я могу видеть в оповещении или консоли. запишите, что он возвращает сообщения об успехе или ошибке, но, похоже, я не могу получить условие из этого Resonsetext. Я пытался использовать responseText.Search («Ошибка»), но это нарушает весь мой процесс проверки js.

2. @robx: Ты пробовал if (responseText == "Error") /* foo */ ?

3. @robx — похоже, resonsetext пуст. Что вы увидели, когда раскомментировали «alert (responseText);»?

4. я получаю нужный мне resonsetext, но я тестирую разные методы, чтобы увидеть, что работает лучше всего на данном этапе.

Ответ №3:

Если вы обнаружите ошибку на стороне сервера, пусть ваш php-код установит статус ответа равным 500 и вернет ваше сообщение об ошибке. Это вызовет обратный вызов ajaxForm с ошибкой.

Я не разбираюсь в PHP, поэтому я не уверен, как бы вы установили свой ответ равным 500, но я использую этот метод с Asp.net и это работает отлично.

Ответ №4:

Раньше я возвращал 200 независимо от того, произошла ошибка или нет, и я возвращал код ошибки, возвращая разные строковые сообщения, но это не было хорошей практикой в соответствии со структурами RESTful. Вот ссылка на то, что я имею в виду.

Итак, создание соответствующего исключения в вашем серверном коде, по-видимому, является наилучшей практикой.

создать новое исключение (‘Деление на ноль.’);

Когда это произойдет, ваш ajax-клиент получит ответ с кодом состояния Http (500). Jquery понимает и запускает событие ошибки (jqXHR, textStatus, errorThrown), используя этот код состояния (который равен 500 = внутренняя ошибка сервера), и он вернет ваши пользовательские сведения об исключении.

Затем вы можете проанализировать эти 3 параметра и дать надлежащий ответ вашему клиенту.