it-swarm.com.ru

плагин формы jquery, без обработки ошибок

Кажется, что в плагине Jquery.Form нет средства обработки ошибок, что очень расстраивает. Несмотря на то, что в документации сказано, что мы можем использовать параметры $ .ajax, я все равно не могу использовать параметр 'error', когда сервер возвращает ошибку, особенно серии 500 и 400. Это то, что этот плагин не может обрабатывать какие-либо ошибки с сервера, или это ошибка и т.д.? Может кто-нибудь сказать мне, как я могу обрабатывать ошибки (400, 500 и т.д.) С этим плагином? Мне нужна ваша помощь ... Все, что я хочу, это простая обработка ошибок ... Спасибо.

$("#uploadingImg").hide();

var options = {//Define ajax options
    type: "post",
    target: "#responsePanel",
    beforeSend: function(){
        $("#uploadingImg").show();
    },
    complete: function(xhr, textStatus){
        $("#uploadingImg").hide();
    },
    success: function(response, statusString, xhr, $form){
        // I know what to do here since this option works fine
    },
    error: function(response, status, err){
        // This option doesn't catch any of the error below, 
        // everything is always 'OK' a.k.a 200
        if(response.status == 400){
            console.log("Sorry, this is bad request!");
        }
        if(response.status == 601){
            sessionTimedOut();
        }
    }
}
$("#polygonUploadForm").submit(function(){
    $(this).ajaxSubmit(options); // Using the jquery.form plugin
    return false;
});
17
Shaoz

Плагин jQuery Form обрабатывает ошибки, и документация является правильным, указав, что он может использовать параметры $ .ajax . Однако есть два режима работы плагина - обычный и загрузка файлов. Проблема в том, что вы выполняете загрузку файла . (Вы не говорите этого, но у вас есть "#uploadingImg" и "#polygonUploadForm", и, рекурсивные рассуждения, у вас есть эта проблема.)

Обычно это утверждается, но вы не можете загрузить файл с помощью AJAX. Этот обходной путь должен использовать iframe. Форма отправки отправляет обычный запрос HTTP и загружает ответ сервера в iframe. Плагин захватывает ответ и вуаля. Поскольку это происходит как обычный HTTP-запрос, правила и поведение $ .ajax не применяются (потому что он не используется). Единственное, что может сделать плагин Form - это относиться к тому, что он получает, как к успеху. В терминах кода загрузка файла никогда не вызовет атрибут "error", назначенный ajaxForm () или ajaxSubmit (). Если вы действительно хотите доказать, что это не AJAX запрос, присоедините к форме обработчик ajaxComplete () (т. Е. Полностью независимый от методов плагина Form). Это тоже не сработает. Или посмотрите на панель Firebug Net-> XHR.

Вот и все - загрузка не является запросом AJAX. Лучшее, что вы можете сделать, - это работать с "успешными" или "полными" обратными вызовами ajaxForm ()/ajaxSubmit (). Вы ограничены без доступа к фактическому коду ответа HTTP, но вы можете проверить ответ. Если ответ пуст или не соответствует ожидаемому, вы можете вызвать обратный вызов "error", вызвав xhr.abort(). Вместо того чтобы делать "if (хороший ответ) {yay!} Else {oh no!}", Вызов abort () и запуск "error" делает код немного чище и понятнее IMHO. Вот пример кода:

$("#uploadForm").ajaxForm({
    success: function(response, textStatus, xhr, form) {
        console.log("in ajaxForm success");

        if (!response.length || response != 'good') {
            console.log("bad or empty response");
            return xhr.abort();
        }
        console.log("All good. Do stuff");
    },
    error: function(xhr, textStatus, errorThrown) {
        console.log("in ajaxForm error");
    },
    complete: function(xhr, textStatus) {
        console.log("in ajaxForm complete");
    }
});

Плохой ответ напечатает это в журнале консоли:

[jquery.form] state = uninitialized
"NetworkError: 404 NOT FOUND - http://server/fileupload/"
[jquery.form] state = loading
[jquery.form] isXml=false
in ajaxForm success
bad or empty response
[jquery.form] aborting upload... aborted
in ajaxForm error
in ajaxForm complete
in ajaxForm complete

Я не знаю, почему "полный" обратный вызов запускается дважды - кто-нибудь? И последнее: прочитайте этот поток , если вы спрашиваете, почему плагин jQuery или Form не может просто читать заголовки HTTP iframe.

49
JCotton

Только что обнаружил, что сам плагин jquery.form не обрабатывает ошибку сервера, потому что у него нет доступа к заголовкам ответов из-за того, как тег 'file input' обрабатывает загрузку файла. Поэтому я думаю, что W3C необходимо просмотреть этот проблемный тег, который не только не позволяет стилизовать его с помощью CSS, но и не облегчает обработку ответов сервера.

Должен быть способ обойти это, хотя ...

Дайте мне знать, если я сказал что-то не так, и дайте мне знать ваши мысли по поводу этого тега 'file input' ...

1
Shaoz

JQuery Form Plugin обрабатывает статус ответа сервера (код 200), я думаю, что информации достаточно.

Из этого вы можете создать свой статус ответа на стороне сервера

            return $this->returnJson(array(
                'response' => 'success',//error or whatever
                'data' => 'Succesfully saved in the database'
            ));

конечно returnJson - это функция для отправки данных Json (вы можете создать их или делать внутри вашего метода)

в интерфейсе на дескрипторе успеха (срабатывает, когда ответ равен 200), вам просто нужно проверить свое поле состояния (в данном случае "ответ"), пример ниже:

  var options = {
        dataType : 'json',
        success: handleResponse
    };


    function handleResponse (responseText, statusText, xhr, $form){

          if(responseText.response == 'success') {
                  //do something

                }else if(responseText.response == 'error'){
                    //do something

            }


    }
1
Riccardo Rich Giacomelli

В опциях

var options = { 
    target:        '#output2',    
    beforeSubmit:  showRequest,   
    success:       showResponse,  
timeout:    1000
}; 

в случае ошибки вызов триггера отсутствует. Плагин просто зависает, когда вы получаете 500 или 404. Успех зависит только от "успеха", так что это все, что у нас есть на данный момент.

0
NickOpris

Для тех, кто все еще нуждается в этом, это способ заставить это работать

function submitForm()
{
    var isSuccess   = false,
        options = {
            url         : "posturl.php",
            type        : 'POST',
            dataType    : 'json',
            success:function(msg) {
                //set the variable to true
                isSuccess = true;

                //do whatever
            },
            complete: function () {
                if (isSuccess === false) {
                    //throw the error message
                }
            }
        };

    //Ajax submit the form
    $('#your_form').ajaxSubmit(options);

    // always return false to prevent standard browser submit and page navigation
    return false;
 }
0
Ruben Benjamin