Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.03.2009, 14:53
Новичок на форуме
Отправить личное сообщение для Zeboton Посмотреть профиль Найти все сообщения от Zeboton
 
Регистрация: 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 в противном случае.
Ответить с цитированием
  #2 (permalink)  
Старый 10.03.2009, 15:03
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Zeboton, так у Вас же уже есть callback, который вызывается по завершению запроса (и там, даже, уже какая-то проверка есть - if ( answ != 1 ){...}). Здесь и выводите сообщение об ошибке (в callback'e) - запрос же асинхронный.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #3 (permalink)  
Старый 10.03.2009, 15:16
Новичок на форуме
Отправить личное сообщение для Zeboton Посмотреть профиль Найти все сообщения от Zeboton
 
Регистрация: 10.03.2009
Сообщений: 9

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

Так можно ли получить во внешний JavaScript что-нибудь из jQuery не используя DOM объекты?
Ответить с цитированием
  #4 (permalink)  
Старый 10.03.2009, 15:53
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Zeboton, еще раз - запрос асинхронный (99%). Это означает, что функция checkEmail запустила запрос и благополучно завершилась. Т.е. моментальная проверка if (checkEmail(...)) ничего не даст, поскольку еще данных для проверки нет - они еще не пришли с сервера. Когда они придут - не известно, но известно, что у нас есть функция для обработки этих данных - этот самый третий параметр (функция, callback), который Вы передаете в $.post(...).

А зачем Вам для проверки email'а отправлять запрос на сервер? Проверьте на клиенте. Тогда и можно сделать, то, что Вы хотите:

if (checkEmail($("#id_email").val())) {
  // ура!
} else {
  // email неверный
}


Сама же функция checkEmail, принимает один параметр - строку и проверяет её регулярным выражением (более-менее приемлемым для email).
__________________
Тонкости ECMAScript
Ответить с цитированием
  #5 (permalink)  
Старый 10.03.2009, 15:54
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Zeboton
То есть чтобы функция checkEmail вернула true, если адрес корректный и false в противном случае.
Так, к сожалению, сделать нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать.
Ответить с цитированием
  #6 (permalink)  
Старый 10.03.2009, 16:12
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 10.03.2009, 16:48
Новичок на форуме
Отправить личное сообщение для Zeboton Посмотреть профиль Найти все сообщения от Zeboton
 
Регистрация: 10.03.2009
Сообщений: 9

Всем спасибо за ответы. Буду разбираться. А AJAX я давно не трогал и слегка подзабыл его основы.

Про говнокодера хорошо пошутили
Ответить с цитированием
  #8 (permalink)  
Старый 10.03.2009, 17:20
Новичок на форуме
Отправить личное сообщение для Zeboton Посмотреть профиль Найти все сообщения от Zeboton
 
Регистрация: 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;
	}
}
Ответить с цитированием
  #9 (permalink)  
Старый 10.03.2009, 18:00
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Zeboton, только стоит помнить, что проверка на клиенте - не нажёжный вариант, поскольку можно послать http-запрос и без браузера (socket'ом, например). Поэтому, на клиенте следует делать проверку, как дополнение к серверной (избежим лишних запросов для мелких проверок, а на сервере - подстрахуемся, когда уже однозначно запрос отправиться на выполнение, а не на проверку; внутри процедуры выполнения будет проверка всех полей).

Это, конечно, нарушает DRY (Don't Repeat Yourself), но, если сделать небольшую библиотеку для проверки и не акцентировать на ней особо внимание, т.е. не вызвать вручную эти проверки, а навесить их автоматом скриптом (на сабмит формы, например); сами же элемты могут иметь, например, атрибут validate="required|email", что говорит, что этот элемент обязателен для заполнения и должен еще и является правильным email'ом. Это может повысить эффективность и снизить "ненужные" запросы к серверу.

Однако, повторю, ни в коем случае нельзя доверять проверку серьёзных данных JavaScript'у, потому JS подгрузился - всё - я могу полностью заменить Вашу функцию checkEmail (через строку адреса, либо консоль):

window.checkEmail = function () { return true; };


Поэтому - на сервере проверка - обязательна.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 10.03.2009 в 18:12. Причина: дополнения
Ответить с цитированием
  #10 (permalink)  
Старый 10.03.2009, 18:28
Новичок на форуме
Отправить личное сообщение для Zeboton Посмотреть профиль Найти все сообщения от Zeboton
 
Регистрация: 10.03.2009
Сообщений: 9

Естественно, на сервере проверки у меня есть.
PHP класс, формарующий формы с проверками валидности введённых данных на JS у меня тоже есть, но для регистрационной формы этот класс не подошёл, так как на странице регистрации архитектура страница отлична от той, которая на остальных страницах.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery для загрузки страницы в <div> Dr.Holerik jQuery 12 11.10.2016 17:36
Jquery, Dynatree и JSON antirek jQuery 6 01.09.2009 15:00
Видимость переменных HelpeR Общие вопросы Javascript 6 21.02.2009 21:29
первый опыт jquery. Вопросы. Titto jQuery 0 17.09.2008 10:32
jQuery Dialog и Datepicker Гость jQuery 14 12.08.2008 08:42