1

JQuery (モバイル) を使用してアプリを作成していますが、JQuery イベントの構造に問題があります。次のようなダミーの「クラス」を定義しました。

MyClass = function()
{
    this.property = initvalue;

    this.foo = function()
    {
        alert("That's my property = " + this.property);
    }
}

次に、MyClass に基づいてオブジェクトを定義しました。

var obj1 = new MyClass();

問題は、obj1.foo() をコールバック関数として使用して、イベントについて通知を受けるときに発生します。たとえば、次のようになります。

$(element).click(obj1.foo);

また

$(element).load(URL, obj1.foo);

foo() が実行されると、「this」はオブジェクト「obj1」ではなく要素を参照します。もちろん、自己参照でオブジェクトの「プロパティ」にアクセスすることはできません。どうすれば修正できますか?

4

3 に答える 3

0

メソッドをそのインスタンスにバインドできます。

$(element).click(obj1.foo.bind(obj1));

.bind()メソッドは関数を返すので、関数を jQuery メソッドに渡しますが、その関数のコンテキストは、渡したものにバインドされます.bind()

古いブラウザーをサポートする必要がある場合は、以前にリンクされた MDN の記事に記載されているポリフィルを使用するか、$.proxy代わりに jQuery メソッドを使用できます。

于 2013-02-15T16:09:22.030 に答える
0

jQuery のproxyメソッドを使用できます。

$(element).load(URL, $.proxy(obj1.foo, obj1));

obj1これにより、コンテキストがメソッドに割り当てられます。

于 2013-02-15T16:10:15.243 に答える
0

thisオブジェクトのコンテキストでキャッシュされたバージョンを参照する無名関数にクリック イベントをバインドできます。

var myClass = this;
$(element).click(function () { myClass.foo(); });

一般に、$.bind、$.proxy、および _.bindAll などのライブラリ提供の代替手段よりもこのメソッドを使用する方がパフォーマンスが高くなります (ただし、現在の例では、パフォーマンスは同等になると思います)。コンテキスト バインディングに関するこの記事を参照してください。

于 2013-02-15T16:26:07.440 に答える