$(this)AJAX成功の内側が機能しない


103

$(this)を使用できるように、onclickを使用する古いコードを変更しようとしています。問題は、成功の内側では$(this)が機能しないことです。とにかく、varとして設定せずにこれを行う方法はありますか?

$('.addToCart').click(function() {

    $.ajax({
        url: 'cart/update',
        type: 'post',
        data: 'product_id=' + $(this).attr("data-id"),
        dataType: 'json',
        success: function(json) {

            if (json['success']) {

            $(this).addClass("test");

            }   
        }
    });

});

回答:


231

問題

コールバック内では、イベントハンドラーがバインドされた要素ではなく、Ajax呼び出しのオブジェクトをthis参照しjqXHRます。JavaScriptでの動作の詳細をご覧くださいthis


ソリューション

ES2015 +が利用できる場合は、矢印関数を使用するのがおそらく最も簡単なオプションです。

$.ajax({
    //...
    success: (json) => {
         // `this` refers to whatever `this` refers to outside the function
    }
});

次のcontextオプションを設定できます

このオブジェクトは、すべてのAjax関連のコールバックのコンテキストになります。デフォルトでは、コンテキストは、呼び出しで使用されるajax設定を表すオブジェクトです(に$.ajaxSettings渡される設定とマージされます$.ajax)。(...)

$.ajax({
    //...
    context: this,
    success: function(json) {
         // `this` refers to the value of `context`
    }
});

または使用$.proxy

$.ajax({
    //...
    success: $.proxy(function(json) {
         // `this` refers to the second argument of `$.proxy`
    }, this)
});

またはthis、コールバックの外側の値への参照を保持します。

var element = this;

$.ajax({
    //...
    success: function(json) {
         // `this` refers to the jQXHR object
         // use `element` to refer to the DOM element
         // or `$(element)` to refer to the jQuery object
    }
});

関連した


1
私はJavaScriptでより良くなり、ますます大きく複雑なプロジェクトを構築しているので、やっとこれを理解していましたが、この答えを見ると、私の仮定が理論だけでなく正しいことを知るのにとても役立ちます。 SOコメントポリシーに反する場合!=)
JasonDavis 2015

私は同意する(そして感謝する)、これら3つのオプションはすべて機能します。ajaxコンテキストオプションについて知りませんでした。マイナーな欠点は、私のIDE(Phpstorm)がオプションを認識しないことです。これは、このようなJSクロージャで検出されるスコープの問題を解決するのに役立ちます。プロキシラッパーを追加すると警告が消えるので、コンテキスト:これはおそらく巨大なヒューリスティックリストでは不明なトリックである必要があります。
scipilot

コンテキストオプションの同上。完璧に働きました。
Anna_MediaGirl

優れた例!
Jawwad Rizwan

-2
jQuery(".custom-filter-options .sbHolder ul li a").each(function () {
    var myStr = jQuery(this).text();
    var myArr = myStr.split(" (");
     url = 'your url'; // New Code
            data = myArr[0];
                try {
                    jQuery.ajax({
                        url : url,
                        context: this,
                        type : 'post',
                        data : data,
                        success : function(data) {
            if(data){
                  jQuery(this).html(data);
            }else{
                  jQuery(this).html(myArr[0]);
            }
                        }
                    });
                } catch (e) {
                } 


});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.