Нужна помощь jQuery + Ajax

12
artalex
На сайте с 08.12.2005
Offline
144
1100

Приветствую вас и прошу помочь с jQuery + Ajax.

Ситуация такая:

Делаю форму регистрации. Кладу ее в отдельный <div>. "action" этой формы - файл-обработчик...


<div id="form_result"></div>
<div id="regform_div">
<form id="regform" action="process.php" method="post">
... поля формы
</form>
</div>

В файле - обработчике (process.php) следующее:


<?php
... проверяю все поля
if(OK) // если все ок с полями, то пишу юзера в базу и вывожу:
echo '<div id="success">Спасибо за рег.</div>';
?>

Таким образом, при удачной регистрации у меня имеет быть в наличии div с id="success"...

В хедере файла, в котором лежит форма регистрации - ajax, который перехватывает событие submit формы и направляет вывод в div с id="form_result"


jQuery("#regform").live('submit', function(){
...
// тут использую live...
// обрабатываю форму и т.д... и вот тут вся загвоздка:
// хочу "погасить" div, в котором лежит форма, Если имеет быть в наличии div id="success"

if(jQuery("div").is("#success"))
{
jQuery("#regform_div").fadeOut();
}

}); ...

Вроде использую live... Но fadeOut происходит только при повторной отправке формы. когда слой "success" УЖЕ есть в DOMe ... Гуглил насчет релоада DOM в jQuery, но кроме live() ничего не вижу...

Кто может помочь?

topy
На сайте с 28.03.2006
Offline
142
#1

.live вешает обработку на документ,

может так попробовать?


$(function() {
$('#regform').submit(function(){
//аяксы всякие
}
Новости коротко и ясно (https://subnews.ru)
artalex
На сайте с 08.12.2005
Offline
144
#2

topy, так, конечно, и было поначалу... ничего не меняется... jquery "не видит" слой с id='success' в DOMе документа (так как его там нет...), и срабатывает только при повторной отправке формы...

maldivec
На сайте с 04.11.2008
Offline
160
#3

Вообще, вот так:

artalex:
// тут использую live...
// обрабатываю форму и т.д... и вот тут вся загвоздка:
// хочу "погасить" div, в котором лежит форма, Если имеет быть в наличии div id="success"

Очень сложно понять, что вы не верно делаете. Вам не кажется?

Зачем вам вообще


echo '<div id="success">Спасибо за рег.</div>';

и потом проверка наличия этого дива? Лишняя работа.

Отдавайте скриптом ответ в json, а в jquery в зависимости от ответа скрывайте форму или выдавайте сообщение об ошибке.

что-то вроде


<?php
... проверяю все поля
if(OK){ // если все ок с полями, то пишу юзера в базу и вывожу:
echo '{"result":"success","text":"Спасибо за регистрацию"};
}else{
echo '{"result":"error","text":"Ошибка регистрации"};
}
?>

Ну а в Jquery парсим json и в зависимости от result делаем нужное действие. Даже live не нужен.

T
На сайте с 27.06.2006
Offline
179
#4

ух, какие хитросплетения :)

Сделайте проще,

укажите в форме target:

<div id="regform">

<form action="process.php" id="newpost_form" name="newpost_form" target="my_target" method="post">

....

</form>

</div>

Далее:

<iframe id="my_target" name="my_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

В обработчике process.php

function sendmessage($mes)

{

?>

<script language="javascript" type="text/javascript">window.top.window.returnform('<? echo $mes; ?>');</script>

<?

exit;

}

в $mes - передавайте флаг успешности регистрации

ну и в первом файле опишите функцию returnform

function returnform(data)

{

if (data=="formerr")

{

alert ('Не заполнена форма.');

}

elseif (data=="ok")

{

// Скрытие формы

}

return false;

}

Ведь намного проще :)

maldivec
На сайте с 04.11.2008
Offline
160
#5
Trump:
ух, какие хитросплетения

Вот как раз у вас хитросплетения. Нафиг нам iframe если мы юзаем ajax? Возвращение в каменный век?

Так делали до появления аякса, именно вместо этого гемора его и придумали.

T
На сайте с 27.06.2006
Offline
179
#6
maldivec:
Вот как раз у вас хитросплетения. Нафиг нам iframe если мы юзаем ajax? Возвращение в каменный век?
Так делали до появления аякса, именно вместо этого гемора его и придумали.

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

Описанный мной способ абсолютно нагляден и гибок (обработчик возвращает флаг, JS его обрабатывает) и предлагает готовое решение, а не _общие рекомендации_.

artalex
На сайте с 08.12.2005
Offline
144
#7
maldivec:

Ну а в Jquery парсим json и в зависимости от result делаем нужное действие...

Похоже, что правильный путь...

С json еще не сталкивался... Как его "отпарсить"? Можете пример скинуть?

Trump, спасибо... но айфрейм действительно не хочется... хочется именно ajax-ом. Причем, именно им сейчас эти фишки и делают (видел часто... вот пробую "на себе"...)

maldivec
На сайте с 04.11.2008
Offline
160
#8

Ну раз уж человек все равно использует JQuery - то лучше все через него и делать.

Не думаю, что фреймворк тут используется только для регистрации.

Я не спорю, ваш вариант рабочий. Просто я не стороник использования разных способов и методов в одном проекте. Нужно все держать в едином стиле - выбрали jquery - работаем с jquery.

Кстати, раз уж не хочется работать с json, но обработчик тоже может выводить только


<?php
... проверяю все поля
if(OK){ // если все ок с полями, то пишу юзера в базу и вывожу:
echo 'ОК'
}
?>

А jquery


jQuery("#regform").submit(function(data){
if (data == 'ОК'){
Скрываем форму
}else{
выводим ошибку
}
}

Просто первый вариант хорош тем, что можно указать текст для кажодй ошибки, например "неверный формат e-mail" или "Форма не заполнена", "Пароль слишком короткий" и т.п.

T
На сайте с 27.06.2006
Offline
179
#9
maldivec:

Нужно все держать в едином стиле - выбрали jquery - работаем с jquery.

Тут не поспоришь :)

Конечно из примера ТС не видно кода самого проекта, и опыта работы с Jquery, да и когда решений несколько удобнее выбрать наиболее быстрое и эффективное для данной задачи.

maldivec
На сайте с 04.11.2008
Offline
160
#10

http://api.jquery.com/jQuery.parseJSON/


jQuery("#regform").submit(function(data){
var obj = jQuery.parseJSON(data);
if (obj.success == 'ОК'){
alert(obj.text);
}else{
alert(obj.text);
}
}

НУ по хорошему еще бы проверку ответа сервера нужно делать..., но это детали.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий