2012-02-12 11 views
-1

これはなぜ機能しないのかわかりませんが、私は壁にいて、不満です。なぜ私はwyr.message.close関数の中からthis.myselfを呼び出せないのですか?たぶん私の理解が察されているかもしれませんが、私はこれが機能ではなくオブジェクト自体を指していると確信していました。JSオブジェクト、自分の中からオブジェクトにアクセスする方法

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

使用例を追加できますか?あなたが 'message'で何をしたいのかが完全にはっきりしておらず、あなたの目標を達成するためにもっと慣れ親しんだ方法があるかもしれません。 –

答えて

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は、wyr.messageオブジェクトではなく、jQueryによって処理されている要素にバインドされています。

EDIT

init方法の問題もあります。 SetTimeoutthisの値をグローバル(window)オブジェクトにバインドするので、私たちが望むthisへの参照を保存し、それをcloseメソッドを呼び出すために使用します。

また、Function.prototype.bindを見ることもできますが、古いブラウザではサポートされていません。

+0

あなたはもちろん天才です。愚かな私の声援 –

+0

hummこれは言った。私は今this.myself.fadeOutで同じエラーを取得します。それがどのようにうまくいくかはわかりません。それは未定義です。 –

+0

ああ、そうです。私の悪い。 'init'メソッドを見ていない...そこにも文脈の問題があります。私は私の答えを編集しました。 –

0

最初に、javascriptオブジェクトのリテラルプロパティ式は、オブジェクトインスタンスの作成時に評価されます。 myselfは、そのセレクタがその時点で取得したものであり、これはおそらく何もありません。呼び出し時に$('.message')の値を返す場合は、myselfプロパティを関数にする必要があります。結果として、すべての用途を関数呼び出しにも変更する必要があります。

第二に、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(); 
     }); 
    } 
    }; 

(これはフェードアウトし、セレクタに一致するすべてのものを削除します、注意してくださいタイムアウトが発生したとき)

関連する問題