$ (це) всередині успіху AJAX не працює


103

Я намагаюся змінити старий код, який використовує onclick, щоб я використовував $ (це). Проблема полягає в тому, що $ (це) не працює, коли всередині успіху. Чи потрібно це зробити, не встановлюючи його як 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

Проблема

Всередині зворотного дзвінка thisпосилається на jqXHRоб'єкт виклику Ajax, а не на елемент, до якого прив'язувався обробник подій. Дізнайтеся більше про те, як thisпрацює JavaScript .


Рішення

Якщо 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 та будую все більші та складніші проекти, я, нарешті, дещо зрозумів це, але бачачи цю відповідь дуже допомагає мені зрозуміти, що мої припущення є правильними, а не просто теорією, тому я особисто дякую вам, навіть якщо проти ТА коментувати політику! =)
JasonDavis

Я погоджуюся (і дякую), усі три ці варіанти працюють. Я не знав про контекстний варіант ajax. Невеликий недолік полягає в тому, що мій IDE (Phpstorm) не розпізнає параметр, вирішує проблему з областю, яку вона корисно виявляє у закритих JS-програмах, таких як ця. Додавання обгортки проксі-сервісу змушує попередження пропадати, тому контекст: це повинен бути невідомий трюк у його евристичному списку мамонтів.
науковець

Діто для контекстного варіанту. Працювали чудово.
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) {
                } 


});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.