Передача контекста через 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, время: 00:02. |