Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2011, 12:20
Аспирант
Отправить личное сообщение для DorianLeroy Посмотреть профиль Найти все сообщения от DorianLeroy
 
Регистрация: 05.05.2010
Сообщений: 36

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

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


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

Почему так происходит - понять не могу.
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2011, 13:10
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от DorianLeroy
Почему так происходит - понять не могу.
Так ты сам так и написал...
Кликая на БТ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>
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2011, 14:27
Аспирант
Отправить личное сообщение для DorianLeroy Посмотреть профиль Найти все сообщения от DorianLeroy
 
Регистрация: 05.05.2010
Сообщений: 36

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

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

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

Не понятно почему после второго(третьего, четвертого) клика на БТ1, выолняется два(три, четыре) алерта БТ2.
Ответить с цитированием
  #4 (permalink)  
Старый 29.09.2011, 14:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от DorianLeroy
Не понятно почему после второго(третьего, четвертого) клика на БТ1, выолняется два(три, четыре) алерта БТ2.
Вот сколько кликнешь на БТ1 - столько раз и пропишется обработчик. Вроде всё предельно ясно...
Ответить с цитированием
  #5 (permalink)  
Старый 29.09.2011, 14:59
Аспирант
Отправить личное сообщение для DorianLeroy Посмотреть профиль Найти все сообщения от DorianLeroy
 
Регистрация: 05.05.2010
Сообщений: 36

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

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

Сделать функции не вложенными не могу - потому что при клике на первой кнопке, создаются переменные, которые впоследствии тоже должны уйти на сервер с кликом на второй кнопке.
Ответить с цитированием
  #6 (permalink)  
Старый 29.09.2011, 15:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

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

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

$('#bt2').unbind('click')
Ответить с цитированием
  #7 (permalink)  
Старый 29.09.2011, 15:20
Аспирант
Отправить личное сообщение для DorianLeroy Посмотреть профиль Найти все сообщения от DorianLeroy
 
Регистрация: 05.05.2010
Сообщений: 36

Сообщение от ksa Посмотреть сообщение

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

$('#bt2').unbind('click')
Вот это по мне

Щас попробую замочить...
Ответить с цитированием
  #8 (permalink)  
Старый 29.09.2011, 16:15
Аспирант
Отправить личное сообщение для DorianLeroy Посмотреть профиль Найти все сообщения от DorianLeroy
 
Регистрация: 05.05.2010
Сообщений: 36

ksa,
Спасибо Тебе, выручил.
Ответить с цитированием
  #9 (permalink)  
Старый 29.09.2011, 16:17
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от DorianLeroy
Вот это по мне
Вспомнил старый анекдот...

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция внутри Live() срабатывает после второго клика Ad1r jQuery 7 09.08.2011 14:11
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Статья о JavaScript Plest Оффтопик 17 12.11.2009 12:24
В качестве параметра функции другая функция, как? Sintez Я не знаю javascript 13 11.06.2009 11:10
Замыкание - это... Zeroglif Общие вопросы Javascript 11 06.03.2009 22:04