3

私のプロジェクトには、プロトタイプ1.7.1を使用するこのコードがあります。

var Worker = Class.create({
    initialize: function() {
        this.ap = $('ap');

        alert( this.ap.value );

        $( 'main-form' ).on( 'change', '.inputs', this.recount );
        this.ap.observe( 'keypress', this.recount );
    },
    recount: function() {
        alert( this.ap.value );
    }
});
document.observe('dom:loaded', function(){
    var w = new Worker();
});

の項目はid="ap"、フォーム内のテキスト入力フィールドです。上記のクラス初期化子の内部で、#ap要素が見つかり、this.apメンバーが割り当てられます(アラートは正しい値を示します)。

ここで、#ap入力値を変更すると、イベントによってrecount呼び出されたメソッドでエラーが発生します-未定義です。この入力の外側をクリックした後、フォーカスを緩めるために、イベントによって呼び出されたメソッドは正しく機能します(割り当てられています)。keypressthis.aprecountchangethis.ap

4

1 に答える 1

3

確かに、ハンドラーはDOM要素のコンテキストで実行されます-インスタンスthisを指していません。Worker使用する

$( 'main-form' ).on( 'change', '.inputs', this.recount.bind(this) );

ところで、クラスに「Worker」という名前を付けるのは良い考えではありません。これにより、グローバルWebWorkerコンストラクターが上書きされます。

于 2012-11-25T21:27:38.153 に答える