Вызов jQuery AJAX всегда выполняется успешно

#jquery #ajax #twitter-bootstrap #validation

#jquery #ajax #twitter-bootstrap #проверка

Вопрос:

У меня есть эта форма входа, в которой я выполняю проверку на стороне сервера, и теперь я пытаюсь выполнить проверку jQuery.

фрагмент формы:

 <div class="form-actions">
     <button type="submit" class="btn green pull-right">Login <i class="m-icon-swapright m-icon-white"></i></button>
</div>
  

Фрагмент jQuery: (Я использую bootstrap login.js )

 submitHandler: function (form) {
    var un = $('#usernameEmail').val();
    var p = $('#pass').val();

    $.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            form.submit();
         },
        error: function(data){
            alert("Error");
        }    
    });  
  }
  

функция checkIfUsernameOrEmailExists работает отлично. Я выполняю console.log(data) функцию успеха (потому что она всегда срабатывает), и данные являются false, когда они должны быть false, и true, когда должно быть true. Итак, учитывая эту ситуацию, я не понимаю, где может быть ошибка.

Редактировать

Я пробовал это раньше без успеха, теперь я точно знаю, что теоретически это правильно, как предложили Рамеш и Кьюн… но все еще не работает, возможно, я что-то не так и не понимаю? Ошибки не отображаются, вход в систему не выполняется console.log и предупреждение не отображается.

 submitHandler: function (form) {
     var un = $('#usernameEmail').val();
     var p = $('#pass').val();
     $.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            if (data) {
                form.submit()
            }else{
                // console.log(data);
                alert(data);
            };
        },
        error: function(data){
            alert("Error");
        }    
        });  
       }
  

РЕШЕНИЕ

Как сказал Blurfus, мне не хватало «» итак, внутри функции success сравнение данных должно проводиться со строкой:

 success: function(data){
    if (data == "true") {
        form.submit()
    }else{
        alert(data);
    };
},
  

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

1. функция успеха вызывается, когда запрос выполнен успешно. он ничего не знает о вашей бизнес-логике.

2. @keune Теперь я знаю. Спасибо за совет. В любом случае, как я уже говорил Рамешкотхе, это работает, когда все успешно и пользователь может войти в систему. Но если это неправильно, предупреждение msge не отображается

3.если data это объект, или массив, или что-либо другое, что является истинным (например, строка "false" ), он отправит форму.

4. @KevinB в самом деле? и каков правильный способ показать, когда это значение равно false? : s

5. возвращает строковое представление объекта в формате json, у которого есть флаг, такой как { "success": false } , а затем устанавливает тип данных в json. if (data.success) { do stuff } в качестве альтернативы вы могли бы заставить ваш сервер возвращать код состояния, отличный от 2xx.

Ответ №1:

Если я правильно понимаю документацию, вам нужно сделать это в вашей success функции обратного вызова

 success: function(data, status, jqXHR){
   ...
} 
  

Да, я знаю, что два других являются необязательными, но в соответствии с сигнатурой функции:

Function(PlainObject data, String textStatus, jqXHR jqXHR )

Data это объект, возвращаемый с сервера, отформатированный в соответствии с dataType параметром (который вы не указали) и возможными значениями которого являются xml, json, script, or html — Однако он пытается использовать интеллектуальное предположение. Итак, другими словами, он не очень хорошо обрабатывает логическое значение as data (вообще?).

Мое лучшее предположение заключается в том, что вам придется сверяться с String подобным:

 if(data == "TRUE"){
    form.submit();
}else{
    alert('Error');
}
  

и, возможно, дополнительно укажите dataType параметр.

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

1. привет, спасибо за комментарий. Это сработало с тем, что сказали Рамеш и Кьюн, поместить логику в функцию success. Но благодаря вам я обнаружил, что проблема заключалась в том, что мне не хватало de «» в строке: if(data == «TRUE»)

Ответ №2:

Я думаю, что ваш checkIfUsernameOrEmailExists просто возвращает TRUE или FALSE. если он выдает какую-либо ошибку, то будет вызвана только ошибка jquery. В противном случае это приведет только к успеху. Если вы хотите выдать ошибку, установите флажок false в success и предупредите об этом.

 $.ajax({
        url:  '/admin/checkIfUsernameOrEmailExists',
        type: 'POST',
        data: {un: un, pass: p},
        success: function(data){
            if(data){
               form.submit();
            }else{
               alert('Error');
            }
         },
        error: function(data){
            alert("Error");
        }    
    });  
  

См .: jQuery Ajax

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

1. Рамеш прав. Проверка jQuery на успешность заключается в том, прошел ли запрос AJAX успешно или нет. Данные, которые вы получаете обратно, не имеют значения.

2. Я делал это раньше и удалил его, потому что у меня это не сработало. Я знаю, что это правильная логика, но этот код для меня не работает. Ошибка предупреждения по-прежнему не отображается, что это может быть?

3. поместите консоль. регистрируйте данные и смотрите, что приходит, приходит как false или нет?

4. консоль @RameshKotha. log работает только тогда, когда это true, когда это false, это не так. Это странно, также не отображаются ошибки

5. если у вас есть firebug, он определенно показывает ошибку.