$ (this) bên trong AJAX thành công không hoạt động


103

Tôi đang cố gắng thay đổi một số mã cũ sử dụng onclick để tôi sử dụng $ (this). Vấn đề là $ (this) không hoạt động khi bên trong thành công. Có cách nào để làm điều này mà không đặt nó làm var không.

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

            }   
        }
    });

});

Câu trả lời:


231

Vấn đề

Bên trong lệnh gọi lại, thisđề cập đến jqXHRđối tượng của lệnh gọi Ajax, không phải phần tử mà trình xử lý sự kiện bị ràng buộc. Tìm hiểu thêm về cách thishoạt động trong JavaScript .


Các giải pháp

Nếu ES2015 + có sẵn cho bạn, thì sử dụng hàm mũi tên có thể là tùy chọn đơn giản nhất:

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

Bạn có thể đặt contexttùy chọn :

Đối tượng này sẽ được làm bối cảnh của tất cả các lệnh gọi lại liên quan đến Ajax. Theo mặc định, ngữ cảnh là một đối tượng đại diện cho cài đặt ajax được sử dụng trong cuộc gọi (được $.ajaxSettingshợp nhất với cài đặt được chuyển đến $.ajax). (...)

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

hoặc sử dụng $.proxy:

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

hoặc giữ một tham chiếu đến giá trị của thisbên ngoài lệnh gọi lại:

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

Có liên quan


1
Khi tôi trở nên giỏi hơn với JavaScript và xây dựng các dự án phức tạp lớn hơn và lớn hơn, cuối cùng tôi đã phần nào hiểu ra điều này, nhưng nhìn thấy câu trả lời này giúp tôi rất nhiều để biết rằng các giả định của tôi là đúng chứ không chỉ là lý thuyết. Vì vậy, cá nhân tôi cảm ơn bạn, thậm chí nếu chống lại chính sách bình luận SO! =)
JasonDavis

Tôi đồng tình (và cảm ơn), cả ba tùy chọn này đều hoạt động. Tôi không biết về tùy chọn ngữ cảnh ajax. Một nhược điểm nhỏ là IDE của tôi (Phpstorm) không nhận ra tùy chọn giải quyết vấn đề phạm vi mà nó phát hiện một cách hữu ích trong các lần đóng JS như thế này. Việc thêm trình bao bọc proxy không làm cho cảnh báo biến mất, vì vậy ngữ cảnh: đây phải là một thủ thuật không xác định trong danh sách khám nghiệm có lẽ là khổng lồ của nó.
scipilot

Ditto cho tùy chọn ngữ cảnh. Hoạt động hoàn hảo.
Anna_MediaGirl

Ví dụ xuất sắc!
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) {
                } 


});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.