我有一个简单的js结构:
var Waiting = (function () {
function Waiting() {
this.timer;
}
Waiting.prototype.show = function () {
var self = this;
clearTimeout( self.timer );
self.timer = setTimeout( function(){ self.hideLogo(); },3000);
}
Waiting.prototype.hideLogo = function () {
console.log("ok i passed timeout");
};
return Waiting;
})();
正如预期的那样,我第一次执行show函数(称为hideLogo)时,每次浏览器都会显示“ok i pass timeout”。当我第二次调用show函数时,问题出现在IE9中。这次,从不调用hideLogo函数(日志永远不会出现在IE控制台中)。我尝试了很多事情但没有取得任何成功。
如果有人作为一个想法...
答案 0 :(得分:2)
当您使用setTimeout
时,正在调用的函数会丢失上下文:换句话说,this
不会发布到该方法的实例上被称为了。您正在使用self
取消此问题,但self
本身就是 iffy 字(如保留关键字)。也许使用that
,并在setTimeout
调用中使用IIFE:
this.timer = setTimeout((function (that)
{
return function()
{
clearTimeout(that.timer);//perhaps clear timeout here?
that.hideLogo.apply(that,[]);//double dutch, the apply _shouldn't_ be required
};
}(this)), 3000);
乍一看,这是我能看到的唯一可能是您的代码问题:clearTimeout
调用应该不是问题,但我喜欢在超时本身结束时调用它,以及self
含糊不清的事情。如果这对你有任何改变,请告诉我!
答案 1 :(得分:0)
我不确定你第二次使用提供的代码打电话给你怎么样,也许你创建一个新的等待()?
这适用于IE8
var Waiting=(function () {
function Waiting() {
this.timer;
}
Waiting.prototype.show = function () {
var self = this;
console.log("will clear pref timeout");
clearTimeout( self.timer );
self.timer = setTimeout(
function(){
self.hideLogo();
},30);
}
Waiting.prototype.hideLogo = function () {
console.log("ok i passed timeout");
};
return new Waiting();
})();
// shows only one time
Waiting.show();
Waiting.show();
// next one will show because it lets the prefious one
// finish without clearing the pref timeout.
setTimeout(function(){
Waiting.show();
},1000);
答案 2 :(得分:0)
尝试:
setTimeout( function(){
clearTimeout( that.timer );
that.hideLogo();
},3000);
在IE和Chrome上为我工作。 IE在所有方面都非常落后。