$ (this) içindeki AJAX başarısı çalışmıyor


103

Onclick kullanan eski bir kodu değiştirmeye çalışıyorum, böylece $ (this) kullanıyorum. Sorun şu ki, başarı içindeyken $ (this) çalışmıyor. Bunu bir değişken olarak ayarlamadan yapmanın bir yolu var mı?

$('.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");

            }   
        }
    });

});

Yanıtlar:


231

Sorun

Geri aramanın içinde, olay işleyicisinin bağlı olduğu öğeyi değil, Ajax çağrısının nesnesini thisifade eder jqXHR. JavaScript'te nasıl thisçalıştığı hakkında daha fazla bilgi edinin .


Çözümler

ES2015 + sizin için mevcutsa, bir ok işlevini kullanmak muhtemelen en basit seçenek olacaktır:

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

contextSeçeneği ayarlayabilirsiniz :

Bu nesne, Ajax ile ilgili tüm geri aramaların bağlamı haline getirilecektir. Varsayılan olarak bağlam, çağrıda kullanılan ajax ayarlarını temsil eden bir nesnedir ( $.ajaxSettingsiletilen ayarlarla birleştirilir $.ajax). (...)

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

veya şunu kullanın $.proxy:

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

veya thisgeri aramanın dışındaki değere bir referans tutun :

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
    }
});

İlişkili


1
JavaScript ile daha iyi hale geldikçe ve daha büyük ve daha büyük karmaşık projeler inşa ederken, sonunda bunu bir şekilde çözdüm, ancak bu cevabı görmek, varsayımlarımın sadece teori değil, doğru olduğunu bilmeme çok yardımcı oluyor, bu yüzden kişisel olarak size teşekkür ediyorum, hatta SO yorum politikasına aykırı ise! =)
JasonDavis

Aynı fikirdeyim (ve teşekkür ederim), bu seçeneklerin üçü de işe yarıyor. Ajax bağlam seçeneğini bilmiyordum. Küçük bir dezavantaj, IDE'min (Phpstorm) bu seçeneğin, bunun gibi JS kapanışlarında yararlı bir şekilde algıladığı kapsam sorununu çözmesini tanımamasıdır. Proxy sarmalayıcısının eklenmesi uyarıyı ortadan kaldırır, bu nedenle bağlam: Bu, muhtemelen devasa sezgisel listesinde bilinmeyen bir numara olmalıdır.
scipilot

Bağlam seçeneği için aynen. Mükemmel çalıştı.
Anna_MediaGirl

Mükemmel Örnek!
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) {
                } 


});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.