Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Передача контекста через setTimeout (https://javascript.ru/forum/jquery/12793-peredacha-konteksta-cherez-settimeout.html)

decadent 03.11.2010 12:16

Передача контекста через 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". Короче, разъясните пожалуйста, а то совсем запутался.

B@rmaley.e><e 03.11.2010 12:26

В 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

decadent 03.11.2010 14:03

Спасибо. Разобрался)

abc_ua 10.02.2011 18:01

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


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