Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Повторение события внутри другого события (https://javascript.ru/forum/jquery/30747-povtorenie-sobytiya-vnutri-drugogo-sobytiya.html)

OlegDegtev 14.08.2012 13:56

Повторение события внутри другого события
 
Всем привет. Пишу аякс систему по добавлению комментариев к статьям. Столкнулся с проблемой. При клике на спец ссылке(внешнее событие) появляется формочка добавления комментария. Заполняю - комментарий, жму ок(внутреннее событи), он улетает в базу, все норм. НО! Если не перезагружая страницу добавить еще один комментарий, то он добавится уже дважды. Третий трижды и так далее. ПРи этом вся анимация добавления комментария тоже повторяется. Анимация внешнего события не меняется (Значит оно не повторяется, повторяется только внутреннее). Хотелось бы понять причину такого поведения.
Весь код приводить не буду, чтоб не путать вас, обьясню сам принцип работы скрипта.
$(".add_c a:first").click(function(){   //ПРи нажатии кнопки добавить комментарий
     //...Происходят всякие расчеты положения модального окошка с формочкой, и его плавное появление...
     $(".add").click(function(event){   //Вложенное событие. При нажатии кнопки добавить в форме:
		event.preventDefault();   //Отменяем действие по умолчанию
                //...Далее заносим данные из полей формы в переменные...
			$.post("/index/ajax.php", {action:"positive", page:page, title:title, comment:comment}, function(data){
				$("#m_rez").html(data);     //Вносим ответ от обработчика с специальный див (типа ваш отзыв успешно добавлен)
				$("#ajax_comment").fadeOut(300);   //Прячем форму 
				$("#m_rez").css({"top": top + "px", "left": left + "px"}).fadeIn(500);    //После чего показываем див с результатом
				$("#m_rez, #m_bg").delay(3000).fadeOut(1500); //А через 3 сек и его прячем
			}, "html");
     });
});

Гугл о проблемах вложенных событий ничего мне не рассказал

vadim5june 14.08.2012 14:04

Цитата:

Сообщение от OlegDegtev
НО! Если не перезагружая страницу добавить еще один комментарий, то он добавится уже дважды. Третий трижды и так далее.

попробуйте добавьте после event.preventDefault();
event.preventDefault();  
event.stopPropagation()

OlegDegtev 14.08.2012 14:19

Не помогает =(
Эта строка так-же повторяется вместе со всеми (Проверил непосредственным втыканием alert("123"); после нее)

OlegDegtev 14.08.2012 14:21

return в конце тоже почему-то не помогает.
Вообще хочется понять причину такого поведения. Что именно я не так делаю

vadim5june 14.08.2012 14:32

Цитата:

Сообщение от OlegDegtev
comment:comment

а в comment что при втором нажатии
то есть версии либо ajax несколько раз срабатывает
либо в coment попадает дважды

vadim5june 14.08.2012 14:37

Цитата:

Сообщение от OlegDegtev
 $("#ajax_comment").fadeOut(300);   //Прячем форму

А как потом она появляется?
Или Вы новую каждый раз создаете?

OlegDegtev 14.08.2012 14:48

var comment = $("#ajax_comment textarea").val();

ТОесть в переменную попадает значение текстовой области. Каждое повторение она содержит одно и то-же. ТОесть первый раз ввожу 123 - там 123, второй раз 345 - там оба раза 345, третий 987 - там 3 раза 987. ПОвторяется не только аякс, повторяется все с 3 по 11 строку. Пробовал после 7 строчки обнулять содержимое инпутов, не помогает

OlegDegtev 14.08.2012 14:49

var top = $(document).scrollTop() + $(window).height() / 2  - $("#ajax_comment").height() / 2;
		var left = $(document).width() / 2 - 460;
		$("#ajax_comment input[name=title], #ajax_comment textarea").val("");
		$("#ajax_comment").css({"top": top + "px", "left": left + "px"}).fadeIn(500);
		$("#m_bg").fadeTo(500,0.7);

Появляется обычным fadeIn'ом.
Эта часть кода находится во внешнем событии и она не повторяется.
Срабатывает только при клике на ссылку как должна

vadim5june 14.08.2012 15:00

попробуйте вот так
$(".add").eq(0).click(

OlegDegtev 14.08.2012 15:04

не помогает =(
Все равно вложенное событие клик выполняется несколько раз, хотя я 1 раза нажимаю

OlegDegtev 14.08.2012 15:10

У меня есть проверка перед аякс запросом на заполненость полей. Запрос выполняется только если оба поля заполнены. Внутри запроса(где function(data)) у меня присутствует строка
$("#ajax_comment input[name=title], #ajax_comment textarea").val("");

ТОесть эта строка должна очистить содержимое полей, и при повторении они не пройдут проверку. Но, они проходят и повторяется запрос. Непонимаю((

Если разделить события на 2 отдельных события, то повторений не наблюдается. Но почему-же повторяются вложенные?

vadim5june 14.08.2012 15:20

такое ощущение что вот это событие добавляется каждый раз при добавлении комментария-а должно только один раз
поставь перед ним аlert
$(".add").click(function(event)

OlegDegtev 14.08.2012 15:29

alert("До");
$(".add").click(function(event){
alert("После");

Так и есть. "До" выскакивает 1 раз только. "После" уже повторяется. Первый раз один раз, второй - два, третий - три и. т. д.

Заметил что первый раз запрос обрабатывается дольше, успевает появиться бегущая строка. Остальные разы неуспевает и моментально выскакивает сообщение о успешном добавлении комментария.

ПОлучается что кнопка формы как-то накапливает на себе события клика. Первый раз кликнули - выполнился обработчик. Второй раз кликнули - кнопка подумала что кликнули 2 раза и обработчик выполнился 2 раза и так далее.
Интересно что не работает строка очистки содержимого формы внутри запроса. Я уже не знаю что предположить, но может эти события как-то параллельно стартуют? Ведь еслиб был цикл, то после очистки переменные получали бы пустые значения, а в них содержатся первоначальные данные.

vadim5june 14.08.2012 15:40

Цитата:

Сообщение от OlegDegtev
"До" выскакивает 1 раз только.

Каждый раз при клике или вообще один раз а потом не выскакивает-так должно быть
Цитата:

Сообщение от OlegDegtev
Интересно что не работает строка очистки содержимого формы внутри запроса

у вас наверно несколько экземпляров формы создается-тогда нужно в конце обработчика после
fadeOut(1500);эту форму удалять

OlegDegtev 15.08.2012 08:50

Полное удаление и создание формы вновь действительно решило проблему. Видимо вы были правы по поводу нескольких экземпляров. ПРавда в какой строке это происходит - так и осталось для меня загадкой.

vadim5june 15.08.2012 11:25

Цитата:

Сообщение от vadim5june
ПРавда в какой строке это происходит - так и осталось для меня загадкой.

нужно разобраться до конца-во время клика происходит создание еще одного экземпляра-то есть разберитесь почему алерт(ло) каждый раз срабатывает-должен только один раз при создании первой формы-а сам факт срабатывания говорит что создалась еще одна копия формы

OlegDegtev 15.08.2012 11:33

Нет, алерт ДО срабатывает только 1 раз при клике и появлении формы. Несколько раз срабатывает алерт ПОСЛЕ. В принципе роблема уже решена, спасибо за подсказку с формами)
ПОследними строками я просто хотел сказать что интересно все-же почему так работал мой скрипт


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