2010-04-15 23 views
27

Dường như tôi không thể truy cập $ (this) bên trong hàm thành công jquery ajax. xin vui lòng xem mã dưới đây.

$.ajax({ 
      type: 'post', 
      url: '<?php echo site_url('user/accept_deny_friendship_request')?>', 
      data: 'action='+$action+'&user_id='+$user_id, 
      success: function(response){ 
       //cannot access $(this) here $(this).parent().remove(); 
      } 
     }); 

Trả lời

53

Điều gì nên $(this)? Nếu bạn có một tham chiếu đến nó bên ngoài chức năng đó, bạn chỉ có thể lưu nó vào một biến.

$('#someLink').click(function() { 
    var $t = $(this); 
    $.ajax(... , function() { 
     $t.parent().remove(); 
    }); 
} 
+0

nếu bạn không thể thêm var vì nó được bao bọc trong một hàm như: '$ ('. Fileupload') .pileupload ({dataType: 'json', start: {} ... etc' – Alex

+0

do đó nó nên là '$ ('. fileupload')'? Nếu vậy, sau đó: 'var $ t = $ ('. fileupload'). fileupload (...)' – nickf

+0

tôi đã tạo một câu hỏi: http://stackoverflow.com/question/42285542/access-this-in-event-jquery-file-upload – Alex

0

Tôi không thể nhìn thấy bất cứ điều gì $(this) tham khảo nhưng cách dễ dàng hơn sẽ được cung cấp cho các phần tử một lớp hoặc id và tài liệu tham khảo mà từ jquery:

Thay vì:

$(this).parent().remove(); 

Bạn có thể làm:

$('#element_id').parent().remove(); 

Lưu ý: Ở đây tôi giả định rằng bạn đang xử lý một phần tử/lần lặp.

+0

Tôi chưa bao gồm mã $ (this) đang tham chiếu đến. nhưng nó sẽ là một số thứ như dưới đây $ ('# element_id'). click (function() {$. ajax ({...})}); – Yalamber

4

Thử gọi $.proxy, để thay đổi phạm vi this bên trong hàm:

$.ajax({ 
    success: $.proxy(function(response) { $(this).parent().bla(); }, $(this)); 
}); 
50

Kiểm tra các tùy chọn bối cảnh - hoạt động hoàn hảo cho tôi:

$.ajax({ 
    context: this, 
    type: 'post', 
    url: '<?php echo site_url('user/accept_deny_friendship_request')?>', 
    data: 'action='+$action+'&user_id='+$user_id, 
    success: function(response){ 
     //can access this now! 
    } 
}); 
+13

Điều này đáng lẽ phải là câu trả lời được chấp nhận, câu trả lời hiện được chấp nhận có vẻ như là hack –

+0

Tôi đồng ý đây là lựa chọn đúng theo tài liệu. Tôi đã không thể sử dụng giải pháp ngữ cảnh khi sử dụng $ .post thay vì $ .ajax. Nó tạo ra một lỗi: "Uncaught TypeError: Invocation bất hợp pháp" .Tôi đang chạy jQuery v1.11.3 và hiểu rằng lỗi gọi là liên quan đến chức năng nguyên mẫu đang được gọi, nhưng không thể sửa chữa nó ngay cả sau khi tìm thấy đường bị thổi lên.Điều này có vẻ là một sự khác biệt giữa $ .post và $ .ajax. Sử dụng một biến, được định nghĩa là có phạm vi trên hàm, là giải pháp làm việc trong tình huống cụ thể đó. –

+0

Brian Layman - vì tò mò, tại sao không sử dụng $ .ajax? –

3

Nếu bạn muốn thisthis trong ngữ cảnh cuộc gọi ajax của bạn, bạn cũng có thể sử dụng .bind() như sau:

$.ajax({ 
    url: 'some_url' 
    success: function(data) { 
    // do something 'this' 
    }.bind(this) 
}) 

Nó liên kết với giá trị của this bên trong gọi lại thành công cho this bên ngoài.

Các vấn đề liên quan