2010-04-15 13 views
27

Wygląda na to, że nie mogę uzyskać dostępu do $ (this) wewnątrz funkcji ajax ajax jquery. zobacz poniższy kod.

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

Odpowiedz

53

Co powinien być $(this)? Jeśli masz odniesienie do niego poza tą funkcją, możesz po prostu zapisać ją w zmiennej.

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

co jeśli nie możesz dodać var, ponieważ jest on zawinięty w funkcję taką jak: '$ ('. Fileupload'). Fileupload ({dataType: 'json', start: {} ... etc' – Alex

+0

, więc powinno być '$ ('. fileupload')'? Jeśli tak, to: 'var $ t = $ ('. fileupload'). fileupload (...)' – nickf

+0

stworzyłem pytanie: http://stackoverflow.com/questions/42285542/access-this-in-event-jquery-file-upload – Alex

0

nie widzę $(this) przedstawieniu bynajmniej łatwiejszy sposób byłoby nadanie elementowi klasę lub identyfikator i oznaczenie, które z jQuery:

Zamiast:

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

Mogłabyś do:

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

Uwaga: Tutaj zakładam, że masz do czynienia z jednym elementem/iteracją.

+0

Nie podałem kodu, do którego odwołuje się kod $ (this). ale byłoby coś takiego poniżej $ ("# element_id"). click (function() {$. ajax ({...})}); – Yalamber

4

Spróbuj zadzwonić $.proxy, aby zmienić zakres this wewnątrz funkcji:

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

Zapoznaj się z opcją kontekst - działa idealnie dla mnie:

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

Ta powinna była być zaakceptowaną odpowiedzią, aktualnie zaakceptowana odpowiedź wygląda na włamywaczkę –

+0

Zgadzam się, że jest to właściwy wybór zgodnie z dokumentacją. doświadczenie Nie byłem w stanie użyć rozwiązania kontekstowego przy użyciu $ .post zamiast $ .ajax .Powoduje to błąd: "Uncaught TypeError: Illegal invocation". Używam jQuery v1.11.3 i rozumiem, że błąd wywołania jest związany z funkcją prototypu, ale nie mógł go naprawić nawet po znalezieniu linii, która wysadzała się w powietrzeTo wydaje się być jeszcze jedna różnica między $ .post a $ .ajax. Używanie zmiennej, zdefiniowanej jako zakres funkcji, było rozwiązaniem roboczym w tej konkretnej sytuacji. –

+0

Brian Layman - z ciekawości, dlaczego nie użyć zamiast tego $ .ajax? –

3

Jeśli chcesz this aby być this w kontekście twojego wywołania ajax, możesz również użyć .bind() jak poniżej:

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

Wiąże wartość this wewnątrz zwrotnego sukces this zewnątrz.

Powiązane problemy