2010-04-15 5 views
27

Кажется, что я не могу получить доступ к $ (этой) внутри функции jquery ajax success. см. ниже код.

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

ответ

53

Что должно быть $(this) be? Если у вас есть ссылка на него вне этой функции, вы можете просто сохранить ее в переменной.

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

Что делать, если вы не можете добавить var, потому что он завернут в такую ​​функцию, как: '$ ('. Fileupload'). Fileupload ({dataType: 'json', start: {} ... etc' – Alex

+0

, поэтому он должен быть '$ ('. fileupload')'? Если это так, то: 'var $ t = $ ('. fileupload'). fileupload (...)' – nickf

+0

i создал вопрос: http://stackoverflow.com/questions/42285542/access-this-in-event-jquery-file-upload – Alex

0

Я не могу видеть ссылки $(this) ничего, кроме простой способ будет давать элемент класс или идентификатор и ссылку, с JQuery:

Вместо:

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

Вы могли бы делать:

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

Примечание: Здесь я предполагаю, что вы имеете дело с одним элементом/итерацией.

+0

Я не включил код $ (это) ссылается на. но это будет нечто вроде ниже $ ('# element_id'). click (function() {$. ajax ({...})}); – Yalamber

4

Попробуйте вызвать $.proxy, чтобы изменить сферу this внутри функции:

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

Заканчивать опция контекст - отлично работает для меня:

$.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

Это должен был быть принятый ответ, принятый в настоящее время ответ кажется хаком –

+0

Я согласен, что это правильный выбор в соответствии с документацией. Я не смог использовать контекстное решение при использовании $ .post вместо $ .ajax. Он выдает ошибку: «Uncaught TypeError: Illegal invocation». Я запускаю jQuery v1.11.3 и понимаю, что ошибка вызова связанный с вызываемой функцией прототипа, но не смог исправить ее даже после нахождения линии, которая взорвалась. Кажется, это еще одна разница между $ .post и $ .ajax. Использование переменной, определяемой областью действия над функцией, было рабочим решением в этой конкретной ситуации. –

+0

Брайан Лайман - из любопытства, почему бы не использовать $ .ajax вместо этого? –

3

Если вы хотите this чтобы быть this в контексте вашего вызова ajax, вы также можете использовать .bind() следующим образом:

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

Он связывает значение this внутри обратного вызова успех this снаружи.