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 関数を 2 回目に呼び出すと、IE9 で問題が発生します。今回は、hideLogo 関数が呼び出されることはありません (IE コンソールにログが表示されることはありません)。私は成功せずに多くのことを試みました。

アイデアとして誰か...

4

3 に答える 3

2

を使用している場合setTimeout、呼び出されている関数はコンテキストを失います。つまりthis、メソッドが呼び出されたインスタンスにポストしません。selfこの問題をキャンセルするために使用していますselfが、それ自体はあいまいな言葉です (予約済みキーワードのように)。おそらく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あいまいなことです。これがあなたにとって何か変わるかどうか教えてください!

于 2013-02-05T10:17:32.160 に答える
0

試す:

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

IEとChromeで私のために働きました。IEはすべてにおいて非常に遅れています。

于 2014-02-16T04:56:10.843 に答える
0

提供されたコードを使用して 2 回目に 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 に答える