#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"
});
};
});