2010-04-15 3 views
27

Il semble que je ne peux pas accéder à $ (this) à l'intérieur de la fonction de succès jquery ajax. S'il vous plaît voir ci-dessous le code.

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

Répondre

53

Que devrait être $(this)? Si vous avez une référence en dehors de cette fonction, vous pouvez simplement la stocker dans une variable.

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

Que faire si vous ne pouvez pas ajouter la variable car elle est enveloppée dans une fonction telle que: '$ ('. Fileupload'). Fileupload ({dataType: 'json', start: {} ... etc' – Alex

+0

devrait être '$ ('. fileupload')'? Si oui, alors: 'var $ t = $ ('.fileupload'). fileupload (...)' – nickf

+0

J'ai créé une question: http://stackoverflow.com/questions/42285542/accès-ce-dans-événement-jquery-fichier-upload – Alex

0

Je ne vois $(this) rien référencement mais moyen plus facile serait de donner à l'élément d'une classe ou l'identifiant et référence de jquery:

Au lieu de:

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

Vous pourriez faire:

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

note: Ici, je suppose que vous avez affaire à un élément/itération.

+0

Je n'ai pas inclus le code auquel $ (this) fait référence. mais ce serait comme ci-dessous $ ('# element_id'). click (function() {$ .ajax ({...})}); – Yalamber

4

Essayez d'appeler $.proxy, changer la portée de this dans la fonction:

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

Découvrez l'option de contexte - fonctionne parfaitement pour moi:

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

Cela aurait dû être la réponse acceptée, la réponse actuellement acceptée semble être un hack –

+0

Je suis d'accord c'est le bon choix selon la documentation. expérience Je n'ai pas été en mesure d'utiliser la solution de contexte lors de l'utilisation de $ .post au lieu de $ .ajax.Il génère une erreur: "Uncaught TypeError: Invocation illégale" .J'utilise jQuery v1.11.3 et je comprends que l'erreur d'invocation est liée à la fonction prototype appelée, mais n'a pas pu la réparer même après avoir trouvé la ligne qui explosait.Cela semble être une différence de plus entre $ .post et $ .ajax. L'utilisation d'une variable, définie pour avoir une portée sur la fonction, était la solution de travail dans cette situation particulière. –

+0

Brian Layman - par curiosité, pourquoi ne pas utiliser $ .ajax à la place? –

3

Si vous voulez this Pour être this dans le contexte de votre appel ajax, vous pouvez également utiliser .bind() comme suit:

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

Il se fixe la valeur de this dans le rappel de succès à l'extérieur this.

Questions connexes