Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция в функции. Обработчики клика. Запутался =) (https://javascript.ru/forum/misc/21917-funkciya-v-funkcii-obrabotchiki-klika-zaputalsya-%3D.html)

DorianLeroy 29.09.2011 12:20

Функция в функции. Обработчики клика. Запутался =)
 
Всем здравия!

Вот не могу понять в чем загвоздка:
$(document).ready(function() {	
   //вешаем обработчика клика по кнопке - оформить заказ
	$('#click1 img').click(function() {
    //вешаем обработчик клика по кнопке - отправить заказ
    $('#click2 img').click(function() {
    //если выполнены некоторые условия(правильно заполнен емэил и т.п.) то отсылаем на сервер данные
    if(key == true){ 
     $.post(); // отсылаем на сервер данные
    }
    });
    });
});


Так вот, если посетитель кликает по #click1, потом выходит из этой формы, чтобы добавить в заказ еще чтонибудь, опять кликает по #click1, потом по #click2 - эта форма отсылается 2 раза. Первый раз - форма - когда юзер первый раз кликнул по #click1, второй раз - когда был произведен второй клик по #click1. (Форму будет отсылаться столько раз - сколько раз посетитель вышел из формы - оформить заказ, а потом вернулся к ней)

Почему так происходит - понять не могу.

ksa 29.09.2011 13:10

Цитата:

Сообщение от DorianLeroy
Почему так происходит - понять не могу.

Так ты сам так и написал... :D
Кликая на БТ1, ты прописал две функции (одинаковые) на БТ2... См. мой пример

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<style type="text/css">
</style>
<script type="text/javascript">
$(document).ready(function (){
	$('#bt1').click(function () {
		alert('bt1')
		$('#bt2').click(function () {
			alert('bt2')
		})
	})
})
</script>
</head>
<body>
<input id='bt1' type='button' value='bt1' />
<input id='bt2' type='button' value='bt2' />
</body>
</html>
</body>
</html>

DorianLeroy 29.09.2011 14:27

О, отличный пример. Только я не могу понять его =)

Первый раз прик клике на БТ2 - нет действия - это ясно, мы вешаем на него обработчик только после клика по БТ1.

Первый клик на БТ1. Потом клик на БТ2 - выполняется алерт БТ2 - это тоже ясно

Не понятно почему после второго(третьего, четвертого) клика на БТ1, выолняется два(три, четыре) алерта БТ2.

ksa 29.09.2011 14:29

Цитата:

Сообщение от DorianLeroy
Не понятно почему после второго(третьего, четвертого) клика на БТ1, выолняется два(три, четыре) алерта БТ2.

Вот сколько кликнешь на БТ1 - столько раз и пропишется обработчик. Вроде всё предельно ясно...

DorianLeroy 29.09.2011 14:59

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

А как же сделать, чтобы при клике(любом количестве кликов) на БТ1 вешался только один обработчик БТ2. Другими словами мне нужно, чтобы один раз на сервер данные отсылались $.post'ом.

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

ksa 29.09.2011 15:08

Цитата:

Сообщение от DorianLeroy
А как же сделать

Вторую кнопку можно прятать/показывать... Делать активной/пассивной... Т.е. варианты реализации всегда есть.

Ну на крайняк просто мочить обработчики перед присваиванием...

$('#bt2').unbind('click')

DorianLeroy 29.09.2011 15:20

Цитата:

Сообщение от ksa (Сообщение 128698)

Ну на крайняк просто мочить обработчики

$('#bt2').unbind('click')

Вот это по мне :agree:

Щас попробую замочить...

DorianLeroy 29.09.2011 16:15

ksa,
Спасибо Тебе, выручил.

ksa 29.09.2011 16:17

Цитата:

Сообщение от DorianLeroy
Вот это по мне

Вспомнил старый анекдот...

Сын звонит матери:
- Мам, тут отец полотенце вином испачкал... Его замочить?
- Оца не трогай!!! А полотенце в стирку брось...


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