Видимость переменных в 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 в противном случае. |
Zeboton, так у Вас же уже есть callback, который вызывается по завершению запроса (и там, даже, уже какая-то проверка есть - if ( answ != 1 ){...}). Здесь и выводите сообщение об ошибке (в callback'e) - запрос же асинхронный.
|
Так, к сожалению, поступить в данном случае нельзя. Не будем вдаваться в подробности почему, так как это долго рассказывать и это совершенно не нужно.
Так можно ли получить во внешний JavaScript что-нибудь из jQuery не используя DOM объекты? |
Zeboton, еще раз - запрос асинхронный (99%). Это означает, что функция checkEmail запустила запрос и благополучно завершилась. Т.е. моментальная проверка if (checkEmail(...)) ничего не даст, поскольку еще данных для проверки нет - они еще не пришли с сервера. Когда они придут - не известно, но известно, что у нас есть функция для обработки этих данных - этот самый третий параметр (функция, callback), который Вы передаете в $.post(...).
А зачем Вам для проверки email'а отправлять запрос на сервер? Проверьте на клиенте. Тогда и можно сделать, то, что Вы хотите: if (checkEmail($("#id_email").val())) { // ура! } else { // email неверный } Сама же функция checkEmail, принимает один параметр - строку и проверяет её регулярным выражением (более-менее приемлемым для email). |
Цитата:
|
Цитата:
ну не хочет он разбиратся.пускай будет говнокодером. чем больше таких кодеров, тем лучше ценится работа хорошего программиста 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 Цитата:
|
Всем спасибо за ответы. Буду разбираться. А AJAX я давно не трогал и слегка подзабыл его основы.
Про говнокодера хорошо пошутили :) |
В результате последовал совету г-на 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; } } |
Zeboton, только стоит помнить, что проверка на клиенте - не нажёжный вариант, поскольку можно послать http-запрос и без браузера (socket'ом, например). Поэтому, на клиенте следует делать проверку, как дополнение к серверной (избежим лишних запросов для мелких проверок, а на сервере - подстрахуемся, когда уже однозначно запрос отправиться на выполнение, а не на проверку; внутри процедуры выполнения будет проверка всех полей).
Это, конечно, нарушает DRY (Don't Repeat Yourself), но, если сделать небольшую библиотеку для проверки и не акцентировать на ней особо внимание, т.е. не вызвать вручную эти проверки, а навесить их автоматом скриптом (на сабмит формы, например); сами же элемты могут иметь, например, атрибут validate="required|email", что говорит, что этот элемент обязателен для заполнения и должен еще и является правильным email'ом. Это может повысить эффективность и снизить "ненужные" запросы к серверу. Однако, повторю, ни в коем случае нельзя доверять проверку серьёзных данных JavaScript'у, потому JS подгрузился - всё - я могу полностью заменить Вашу функцию checkEmail (через строку адреса, либо консоль): window.checkEmail = function () { return true; }; Поэтому - на сервере проверка - обязательна. |
Естественно, на сервере проверки у меня есть.
PHP класс, формарующий формы с проверками валидности введённых данных на JS у меня тоже есть, но для регистрационной формы этот класс не подошёл, так как на странице регистрации архитектура страница отлична от той, которая на остальных страницах. |
Часовой пояс GMT +3, время: 22:25. |