Передача контекста через 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". Короче, разъясните пожалуйста, а то совсем запутался. |
В 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 |
Спасибо. Разобрался)
|
спасибо, помогло
|
| Часовой пояс GMT +3, время: 02:18. |