10.03.2009, 14:53
|
Новичок на форуме
|
|
Регистрация: 10.03.2009
Сообщений: 9
|
|
Видимость переменных в jQuery
Добрый день. Есть функция:
function checkEmail()
{
$.post( "/ajax/registration.ajax.php", { action: "email", email: $("#id_email").val() }, function(xml){
var answ = $( "data", xml ).text();
if ( answ != 1 ){
$("#id_email_err").html( answ );
} else {
$("#id_email_err").html( "" );
}
});
}
Как получить в обычном JavaScript информацию о том как отработала функция в jQuery?
То есть мне нужно что-то типа:
if ( checkEmail() == true ){
// Всё хорошо
} else {
// Выводим сообщение об ошибке
}
То есть чтобы функция checkEmail вернула true, если адрес корректный и false в противном случае.
|
|
10.03.2009, 15:03
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Zeboton, так у Вас же уже есть callback, который вызывается по завершению запроса (и там, даже, уже какая-то проверка есть - if ( answ != 1 ){...}). Здесь и выводите сообщение об ошибке (в callback'e) - запрос же асинхронный.
|
|
10.03.2009, 15:16
|
Новичок на форуме
|
|
Регистрация: 10.03.2009
Сообщений: 9
|
|
Так, к сожалению, поступить в данном случае нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать и это совершенно не нужно.
Так можно ли получить во внешний JavaScript что-нибудь из jQuery не используя DOM объекты?
|
|
10.03.2009, 15:53
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Zeboton, еще раз - запрос асинхронный (99%). Это означает, что функция checkEmail запустила запрос и благополучно завершилась. Т.е. моментальная проверка if (checkEmail(...)) ничего не даст, поскольку еще данных для проверки нет - они еще не пришли с сервера. Когда они придут - не известно, но известно, что у нас есть функция для обработки этих данных - этот самый третий параметр (функция, callback), который Вы передаете в $.post(...).
А зачем Вам для проверки email'а отправлять запрос на сервер? Проверьте на клиенте. Тогда и можно сделать, то, что Вы хотите:
if (checkEmail($("#id_email").val())) {
// ура!
} else {
// email неверный
}
Сама же функция checkEmail, принимает один параметр - строку и проверяет её регулярным выражением (более-менее приемлемым для email).
|
|
10.03.2009, 15:54
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Zeboton
|
То есть чтобы функция checkEmail вернула true, если адрес корректный и false в противном случае.
|
Так, к сожалению, сделать нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать.
|
|
10.03.2009, 16:12
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Kolyaj
|
Так, к сожалению, сделать нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать.
|
та дайте этому капризному ребенку то, что он хочет
ну не хочет он разбиратся.пускай будет говнокодером.
чем больше таких кодеров, тем лучше ценится работа хорошего программиста
function checkEmail()
{
var qwe;
$.ajaxSetup({
async: false
});
$.post( "/ajax/registration.ajax.php", { action: "email", email: $("#id_email").val() }, function(xml){
var answ = $( "data", xml ).text();
if ( answ != 1 ){
$("#id_email_err").html( answ ); qwe=false;
} else {
$("#id_email_err").html( "" ); qwe=true;
}
});
$.ajaxSetup({
async: true
});
return qwe;
}
PS
Сообщение от Zeboton
|
Так, к сожалению, поступить в данном случае нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать и это совершенно не нужно.
|
можно.более чем.просто вы не видите решения, так как не понимаете элементарных основ асинхронного програмирования
Последний раз редактировалось Gvozd, 10.03.2009 в 16:15.
|
|
10.03.2009, 16:48
|
Новичок на форуме
|
|
Регистрация: 10.03.2009
Сообщений: 9
|
|
Всем спасибо за ответы. Буду разбираться. А AJAX я давно не трогал и слегка подзабыл его основы.
Про говнокодера хорошо пошутили
|
|
10.03.2009, 17:20
|
Новичок на форуме
|
|
Регистрация: 10.03.2009
Сообщений: 9
|
|
В результате последовал совету г-на Dmitry A. Soshnikov
function checkEmail()
{
var re = /^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i;
var found = $("#id_email").val().match(re);
if ( found == null ){
$("#id_email_err").html( "Ошибка." );
return false;
} else {
$("#id_email_err").html( "" );
return true;
}
}
|
|
10.03.2009, 18:00
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Zeboton, только стоит помнить, что проверка на клиенте - не нажёжный вариант, поскольку можно послать http-запрос и без браузера (socket'ом, например). Поэтому, на клиенте следует делать проверку, как дополнение к серверной (избежим лишних запросов для мелких проверок, а на сервере - подстрахуемся, когда уже однозначно запрос отправиться на выполнение, а не на проверку; внутри процедуры выполнения будет проверка всех полей).
Это, конечно, нарушает DRY (Don't Repeat Yourself), но, если сделать небольшую библиотеку для проверки и не акцентировать на ней особо внимание, т.е. не вызвать вручную эти проверки, а навесить их автоматом скриптом (на сабмит формы, например); сами же элемты могут иметь, например, атрибут validate="required|email", что говорит, что этот элемент обязателен для заполнения и должен еще и является правильным email'ом. Это может повысить эффективность и снизить "ненужные" запросы к серверу.
Однако, повторю, ни в коем случае нельзя доверять проверку серьёзных данных JavaScript'у, потому JS подгрузился - всё - я могу полностью заменить Вашу функцию checkEmail (через строку адреса, либо консоль):
window.checkEmail = function () { return true; };
Поэтому - на сервере проверка - обязательна.
Последний раз редактировалось Dmitry A. Soshnikov, 10.03.2009 в 18:12.
Причина: дополнения
|
|
10.03.2009, 18:28
|
Новичок на форуме
|
|
Регистрация: 10.03.2009
Сообщений: 9
|
|
Естественно, на сервере проверки у меня есть.
PHP класс, формарующий формы с проверками валидности введённых данных на JS у меня тоже есть, но для регистрационной формы этот класс не подошёл, так как на странице регистрации архитектура страница отлична от той, которая на остальных страницах.
|
|
|
|