Помогите разобраться с классами
У меня есть класс (ниже упрощенный вариант)
function Folio() {
this.root = root = jQuery('body');
this.folioWrap = root.find('.items');
this.overflow_ = root.find('.detail-window');
this.itemClick_ = function(evt){
this.loadWork(url,750);
return false;
}
this.loadWork = function(path,delay){
this.overflow_.addClass("show");
setTimeout(function() {
folio.overflow_inner.html(" ").load(path, function() {
folio.loading_.hide();
folio.overflow_inner.addClass("show");
});
}, delay);
}
}
var folio = new Folio();
Проблема в методе loadWork . не могу понять, почему в нем я не могу писать так:
this.loadWork = function(path,delay){
this.overflow_.addClass("show");
setTimeout(function() {
this.overflow_inner.html(" ").load(path, function() {
this.loading_.hide();
this.overflow_inner.addClass("show");
});
}, delay);
}
Пока не смог понять в чем дело, но если написать вместо this.overflow_inner- folio.overflow_inner. То всё работает. Кто-нибудь подскажите, я только недавно начал писать что-то на js. нагуглить не смог ничего. setTimeout используется потому что нужно получить данные с задержкой. |
Функция, переданная в качестве аргумента в setTimeout будет вызывана в контексте window, а не твоего инстанса (folio).
Скорее всего ты просто не понимаешь как работает this в javascript. Почитай об этом. В ES5-совместимых браузерах контекст можно явно задать через .bind(context), в твоем случае это будет
setTimeout( (function(){ ... }).bind(this), delay)
Для старых браузеров либо подключать es5-shim.js либо оставить так, как у тебя, только объявлять folio внутри loadWork: var folio = this. |
Цитата:
|
Спасибо большое.
Я думал, что дело в контексте, но не знал как исправить это. Задержка нужна для визуализации. Во время работы скрипта идет анимация, и если ответ приходит слишком быстро, то анимация прерывается на самом, так сказать, интересном месте. |
Всё заработала - спасибо!
|
| Часовой пояс GMT +3, время: 17:06. |