Проверка jQuery междоменная удаленная проверка JSONP

#jquery #ajax #jquery-mobile #jquery-validate #jsonp

#jquery #ajax #jquery-мобильный #jquery-проверка #jsonp

Вопрос:

У меня проблема с использованием jQuery Validate и междоменной удаленной проверки. Мой сценарий таков:

  • Мобильное приложение PhoneGap
  • PHP-скрипты на удаленном сервере
  • jQuery 1.9.1
  • jQuery Mobile 1.4.2 как платформа интерфейса
  • jQuery Validate 1.12.0 как плагин проверки форм

Для взаимодействия с сервером я использую Ajax-вызовы jQuery и JSONP в качестве метода междоменной связи. Мне нужно проверить некоторые поля формы, используя удаленные правила, но поскольку эти вызовы выполняются в другом домене (из приложения на сервер) У меня проблемы с форматом ответов. Используя JSONP, я не могу вернуть простое «TRUE» или «FALSE», но данные в формате JSONP.

На стороне сервера у меня есть функция PHP, которая возвращает данные в формате JSON:

 if (.....)    
    $return["Result"] = TRUE;    
else
    $return["Result"] = FALSE;

header('Content-type: application/json');
echo $jsoncallback . "(" . json_encode(return) . ")";
  

Со стороны клиента у меня есть этот код проверки jQuery:

 rules: {
    'email': {
        required: true,
        remote: {
            type: 'post',
            url: 'http://www.myurl.com/mypage.php',
            data: {
                email: function() {
                    return $('#email').val();
                }
            },
            dataType: 'jsonp',
            jsonp: 'jsoncallback',
            success: function(data, status) {
                if (data.Result === false)
                    return false;
                else
                    return true;
            }
        }
    }
},
messages: {
    'email': {
        required: 'message 1',
        remote: 'message 2'
    }
}
  

Приведенный выше код, похоже, работает нормально, когда удаленная проверка пройдена, но не при сбое.
Если я помещу подобное предупреждение в поле «успех»,:

 alert(data.Result);
  

Он всегда возвращает правильное значение, но код, похоже, продолжает выполняться, и он не выводит сообщение об ошибке.

Есть ли способ использовать jQuery Validate для проверки поля с использованием удаленного правила и JSONP?

Заранее спасибо.

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

1. Вы уверены, что data.Result это boolean тип?

2. Привет, если я проверю результат с помощью if (data.Result == 'false') , ничего не изменится…

3. пожалуйста, проверьте с alert(typeof data.Result)

4. Возвращается предложенное предупреждение boolean . После появления всплывающего окна с предупреждением код продолжает выполняться, и результаты формы также действительны, если данные. Результат равен FALSE.

5. Это когда-нибудь решалось? У меня похожая проблема, когда метод success вообще не вызывается и ошибка не отображается. Есть ли какой-либо пример, где JSONP используется для удаленного доступа? Спасибо.

Ответ №1:

Документация по jQuery Validate API написана плохо, но похоже, что страница PHP должна отвечать только с помощью true or false , например:

 echo "false";
  

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

1. К сожалению, используя JSONP, я не могу отобразить «true» или «false», но строку, закодированную в json. В этом причина проблемы: (

2. можете ли вы создать PHP-скрипт на своем локальном сервере, который будет действовать как прокси для запроса?

3. Я не могу, потому что на стороне клиента код выполняется в PhoneGap, поэтому я могу использовать только html, css, javascript

4. извините, я имел в виду прокси-скрипт на удаленном сервере; нельзя ли удалить JSONP только для проверки?

5. На самом деле я немного запутался в ответе JSONP. Что еще более важно: вы должны изменить Content-type на application/javascript , это может быть причиной

Ответ №2:

Я знаю, что я немного (слишком?) поздно, но это может помочь кому-то еще…

Проблема в том, что ваша функция «success» перезаписывает функцию удаленного метода по умолчанию; вы должны устранить ошибки самостоятельно с помощью

 validator.showErrors();
  

из вашей функции успешного выполнения, при условии, что вы сохранили объект validator ( var validator = $.validate({ ... }) ).

Ответ №3:

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

Вам не нужна функция success, поскольку она не выполняется, поэтому ее не следует предоставлять. Вместо этого вы должны показать ошибку в вашей функции обратного вызова, как был дан один из ответов. Даже если это указывает на возможное решение, оно не дает четкого примера и не сообщает вам, что условие успеха не требуется.

Краткие сведения:

Условие успеха не требуется. Ваша функция обратного вызова должна показывать ошибки.

     <script type="text/javascript">
$().ready(function() {

    validator = $("#registerForm").validate({
        onkeyup: false,
        rules: {
            name: {
                required: true,
                minlength: 3
            },
            email: {
                required: true,
                email: true,
                remote: {
                    type: 'get',
                    url: 'http://www.myurl.com/checkemail',
                    data: {
                        email: function() {
                            return $('#email').val();
                        }
                    },
                    dataType: 'jsonp',
                    jsonp: 'myCallback'
                }
            },
            password: {
                required: true,
                minlength: 6
            }


        }
    });
    myCallback = function(data) {
        console.log("myCallback data is :"   data);
        if (data !== "true")
            validator.showErrors({
                "email": "This email is already used"
            });
    };
});