所以,我认为没有理由说这不起作用,但我陷入了困境。为什么我不能在wyr.message.close函数中调用this.myself?也许我对此的理解是松散的,但我确信这是指对象本身,而不是功能。
this.myself is undefined
代码:
wyr.message = {
myself: $('.message'),
init: function() {
if(this.myself.is(':visible')){
setTimeout(this.close, 5000);
}
},
close: function(){
this.myself.fadeOut(1200,function(){
this.myself.remove();
});
}
}
答案 0 :(得分:1)
wyr.message = {
myself: $('.message'),
init: function() {
var self = this;
if(this.myself.is(':visible')){
setTimeout(function(){
self.close();
}, 5000);
}
},
close: function(){
this.myself.fadeOut(1200,function(){
$(this).remove();
});
}
}
问题在于背景。在传递给fadeOut
的回调函数中,this
绑定到jQuery正在处理的元素,而不是wyr.message
对象。
修改强>:
init
方法也存在问题。 SetTimeout
会将this
的值绑定到全局(window
)对象 - 因此我们保存对我们想要的this
的引用,并使用它来调用{{1}方法。
您还可以查看close
,但旧版浏览器不支持此功能。
答案 1 :(得分:0)
首先,在创建对象实例时评估javascript对象文字属性表达式。 myself
将是那个选择器当时抓取的东西,这可能是什么都没有。如果您希望它在调用时返回myself
的值,则$('.message')
属性必须是一个函数。因此,您还需要将所有用途更改为函数调用。
其次,在执行setTimeout回调期间,this
绑定到窗口对象,因此您需要对其进行适当的限定:
wyr.message = {
myself: function() { return $('.message'); },
init: function() {
if(this.myself().is(':visible')){
setTimeout(this.close, 5000);
}
},
close: function(){
message.myself().fadeOut(1200,function(){
$(this).remove();
});
}
};
(注意,当超时触发时,这将淡出并删除与选择器匹配的所有内容。)