Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Видимость переменных в jQuery (https://javascript.ru/forum/jquery/3020-vidimost-peremennykh-v-jquery.html)

Zeboton 10.03.2009 14:53

Видимость переменных в 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 в противном случае.

Dmitry A. Soshnikov 10.03.2009 15:03

Zeboton, так у Вас же уже есть callback, который вызывается по завершению запроса (и там, даже, уже какая-то проверка есть - if ( answ != 1 ){...}). Здесь и выводите сообщение об ошибке (в callback'e) - запрос же асинхронный.

Zeboton 10.03.2009 15:16

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

Так можно ли получить во внешний JavaScript что-нибудь из jQuery не используя DOM объекты?

Dmitry A. Soshnikov 10.03.2009 15:53

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

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

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


Сама же функция checkEmail, принимает один параметр - строку и проверяет её регулярным выражением (более-менее приемлемым для email).

Kolyaj 10.03.2009 15:54

Цитата:

Сообщение от Zeboton
То есть чтобы функция checkEmail вернула true, если адрес корректный и false в противном случае.

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

Gvozd 10.03.2009 16:12

Цитата:

Сообщение от 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
Так, к сожалению, поступить в данном случае нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать и это совершенно не нужно.

можно.более чем.просто вы не видите решения, так как не понимаете элементарных основ асинхронного програмирования

Zeboton 10.03.2009 16:48

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

Про говнокодера хорошо пошутили :)

Zeboton 10.03.2009 17:20

В результате последовал совету г-на 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;
	}
}

Dmitry A. Soshnikov 10.03.2009 18:00

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

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

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

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


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

Zeboton 10.03.2009 18:28

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


Часовой пояс GMT +3, время: 11:06.