1

コンテキストを提供しようとしているときにjQuery(v1.8.3)メソッドを使用する次の例を検討してください。ajax()

for(var i=0; i<3; i++) {
  $.ajax({
    url: "foo",
    context: i,
    success: function() { console.log(this); }
}

期待される出力は3つNumberのオブジェクトであり、0, 1 and 2(必ずしもこの順序である必要はありません)を表します。実際、コンソールへの出力は2つNumberのオブジェクトと1つのObjectオブジェクトであり、ajaxリクエストデータが含まれています。

> Number
> Object {url: "foo", isLocal: false, global: true, type: "GET", contentType: "application/x-www-form-urlencoded; charset=UTF-8"…}
> Number

Number3つのオブジェクトを受け取らないのはなぜですか?

4

3 に答える 3

2

jQuery v1.8.3ソースを少し掘り下げた後、私はこれを見つけました:

7645 | // Create the final options object
7646 | s = jQuery.ajaxSetup( {}, options ),
7647 | // Callbacks context
7648 | callbackContext = s.context || s,

これはcontext、呼び出しのオプションajax()が偽である場合は常に、コンテキストパラメータとしてコールバックに割り当てられた値が。thisによって返されるオブジェクトであることを意味しますjQuery.ajaxSetup()

オプションとして偽の値を渡すと、、、などのこの動作が発生することに注意してください。context0null""

小さな変更でこのあいまいさを取り除くことができると信じており、jQuery開発チームにチケットを提出しますが、インターネットの半分を壊す後方互換性のない変更を彼らが評価するかどうかはわかりません:(

callbackContext = s.context !== undefined ? s.context : s
于 2012-11-28T06:57:19.797 に答える
1

このようなことを試してみると役に立ちますか?:

for (var i = 0; i < 3; i++) {
    (function () {
        $.ajax({
            url: "foo",
            context: i,
            success: function () {
                console.log(this);
            }
        });
    })(i);
}

しかし、Estheteが発見したことから離れて、おそらく、を定義するときに文字列に変換できますが、その後、次のようなcontext内部の整数に変換し直すことができます。success

for (var i = 0; i < 3; i++) {
    $.ajax({
        url: "foo",
        context: ""+i,
        success: function () {
            console.log(+this);
        }
    });
}

ただし、もちろん、このような整数を使用しているため、これは実際にはコードにのみ適用されます。他の誤った値を渡す場合は、それほど簡単ではない可能性があります。

于 2012-11-28T07:05:37.930 に答える
1

成功コールバックをコンテキストにバインドしようとします(そしてそれをオブジェクトとして変換します)。

したがって、番号を指定すると、次のようにバインドされます。

 var a=12;
 var test = function(){ console.log(this.valueOf())}.bind(a)
 test();

「this.valueOf()」の代わりに「+ this」にIanの手法を使用できます。これは、文字列でも機能します。

于 2012-11-29T22:52:51.307 に答える