AJAX Closures et ciblant 'this'

Dans l'exemple de code ci-dessous, la fonction de rappel de réussite enregistre 'entrée # 04.update' quatre fois plutôt que chaque entrée individuelle, ce qui permet de voir comment les fermetures fonctionnent, mais comment j'essayerais de cibler chaque entrée individuelle à l'aide de cette.

<input type="text" name="" id="01" class="update"> <input type="text" name="" id="02" class="update"> <input type="text" name="" id="03" class="update"> <input type="text" name="" id="04" class="update"> function updateFields(){ $('input.update').each(function(){ $this = $(this); $.ajax({ data: 'id=' + this.id, success: function(resp){ console.log($this); $this.val(resp) } }); }); } 

Tu as oublié var

 var $this = $(this); 

N'oubliez pas var . Un programmeur qui oubliait var est allé au lit la nuit et s'est réveillé pour trouver son appartement en feu. Il a ajouté var et le feu est sorti. Un autre programmeur a quitté var complètement complètement avant de partir en voyage d'affaires en Europe. L'avion a développé des problèmes mécaniques en vol peu de temps après le décollage, ce qui a amené le pilote à lancer des procédures d'atterrissage d'urgence. De son ordinateur portable, le programmeur a rapidement ajouté var et l'avion l'a fait en toute sécurité dans un aéroport.

N'oubliez pas var . Si vous mettez var dans votre code, vous rencontrerez quelqu'un spécial aujourd'hui . Essayez-le. Cela semble incroyable mais ça marche vraiment!

Pointy est correct sur l'utilisation de var , une autre alternative est d'utiliser $.proxy() , comme ceci:

 function updateFields(){ $('input.update').each(function(){ $.ajax({ data: 'id=' + this.id, success: $.proxy(function(resp){ $(this).val(resp); }, this) }); }); } 

Ce créateur de fermeture fera en sorte que this réfère à l'élément d'entrée lorsque vous êtes à l'intérieur du rappel de success , ce qui est habituellement ce que vous attendez … alors je ne sais pas pourquoi ce n'est pas le cas par défaut, mais dans tous $.proxy() rectifie la situation.