Javascript.RU

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

Передача контекста через setTimeout
Не могу разобраться почему не передается контекст при вызове функции через setTimeout. На заголовки повешены события:

Первое плавно удаляет контейнер, если он есть
$("h3").bind("click", function() {
			if ($(".content").length) {
				$(".content").animate({width: '0'}, function () {
					$(this).remove();
				});
			}
		});

Второе вызывает функцию, где надо поменять местами заголовки. Если контейнер уже удален, то функция вызывается с правильным контекстом, то есть ей передается тот заголовок, на который я кликаю. А если контейнер, еще не удален, то через setTimeout в контексте ничего нет.
$("h3").bind("click", function() {
			if ( $(".content").length) {
				setTimeout(function () {moveObj.func.call($(this))}, 2000);
			}
			else {
				moveObj.func.call($(this));
			}
		});


когда func запускается через setTimeout, то this не тот, который нужен
moveObj = {
	func: function () {
		if ($(this).attr("id") == "main") {
		        $(this).animate({left: '200px'}, 1000, function() {
		               $(this).animate({top: '50px'}, 1000);
			});
          },
 и т.д.


В чем косяк? Я думал сначала что там передается объект контейнера, который я удаляю, но тогда $(this).attr("class") должно быть равно "content", а на деле "undefined". Короче, разъясните пожалуйста, а то совсем запутался.
Ответить с цитированием
  #2 (permalink)  
Старый 03.11.2010, 12:26
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

В setTimeout Вы передаете аргументом свежесозданную функцию, а для любой функции, не привязанной к определенному объекту this === window. Поэтому, $(this) внутри setTimeout эквивалентен $(window).
В Вашем случае нужно "закешировать" this в другой переменной либо передать его аргументом setTimeout;
$("h3").bind("click", function () {
	if ($(".content").length) {
		var self = this;
		setTimeout(function () {
			moveObj.func.call($(self))
		},
		2000);
	} else {
		moveObj.func.call($(this));
	}
});

RTFM
Ответить с цитированием
  #3 (permalink)  
Старый 03.11.2010, 14:03
Аспирант
Отправить личное сообщение для decadent Посмотреть профиль Найти все сообщения от decadent
 
Регистрация: 15.09.2010
Сообщений: 30

Спасибо. Разобрался)
Ответить с цитированием
  #4 (permalink)  
Старый 10.02.2011, 18:01
Кандидат Javascript-наук
Отправить личное сообщение для abc_ua Посмотреть профиль Найти все сообщения от abc_ua
 
Регистрация: 20.05.2010
Сообщений: 105

спасибо, помогло

Последний раз редактировалось abc_ua, 10.02.2011 в 18:18.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача объекта через POST Александр Иванов Общие вопросы Javascript 2 05.11.2009 15:44
Передача массива, через сокет yello Серверные языки и технологии 2 30.10.2009 17:41
Передача через image peter888 Элементы интерфейса 8 06.10.2009 13:39
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 09:36
XMLHTTPRequest передача имя через POST dds AJAX и COMET 0 14.08.2008 13:44