1

我有一个像这样的简单 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 控制台中)。我尝试了很多东西都没有成功。

如果有人作为一个想法......

4

3 回答 3

2

当您使用setTimeout时,被调用的函数会丢失上下文:换句话说this,不再发布到调用该方法的实例。你self用来取消这个问题,但self它本身就是一个不确定的词(如保留关键字)。也许使用that, 并在调用中使用 IIFE setTimeout

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模棱两可的事情。如果这对您有任何改变,请告诉我!

于 2013-02-05T10:17:32.160 回答
0

我不确定您如何使用提供的代码第二次调用 show,也许您创建了一个新的 Waiting()?

这是适用于 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);
于 2013-02-05T10:22:30.107 回答
0

尝试:

setTimeout( function(){
    clearTimeout( that.timer );
    that.hideLogo();
},3000);

在 IE 和 Chrome 上为我工作。IE 在所有方面都非常落后。

于 2014-02-16T04:56:10.843 回答