2010-06-04 5 views
4

Je mets à jour certains div comme suit:jQuery: Comment transmettre une valeur dans un appel Ajax?

for(var i = 0; i < data.length; i++) { 
    var query = base_url + data[i]; 
    $.ajax({ 
     url: query, 
     type: 'GET', 
     dataType: 'jsonp', 
     timeout: 2000, 
     error: function() { self.html("Network Error"); }, 
     success: function(json) { 
      $("#li" + i).html("<img src='" + json.result.list[0].url + "' />") 
     } 
    }); 
} 

La valeur de i ne fonctionne pas dans l'appel ajax. J'essaie de passer la valeur de i pour qu'il puisse attacher l'élément à la div appropriée. Est-ce que quelqu'un peut m'aider?

+0

votre ' Reigel

+0

Just curious, stepping back a level, is firing off 'n' ajax requests the only way to do what you're after? Can this not be done as a batch in one round-trip? This would be a much better and more responsive user experience. –

+0

@Reigel: Fixed it thanks. @Nick: Sorry but could you explain that a little more? I am open to a better approach. – Legend

Répondre

1

Ok. Cela fonctionne mais aimerait vraiment si quelqu'un peut l'expliquer! Je me suis cassé la tête au-dessus de ceci en l'affichant ici juste au cas où quelqu'un en aurait besoin.

for(i = 0; i < data.length; i++) 
    fetchItem(i) 

fetchItem = function(i) { 
    var query = base_url + data[i]; 
    $.ajax({ 
     url: query, 
     type: 'GET', 
     dataType: 'jsonp', 
     timeout: 2000, 
     error: function() { self.html("Network Error"); }, 
     success: function(json) { 
      $("#li" + i).html("<img src='" + json.result.list[0].url + "' />") 
     } 
    }); 
} 
+4

This works because you created a closure which copies 'i', if in your 'success' callback you wrapped it in a closure it'd also work, like this: '(function(j) { return function(json) { $("#li" + j).html("");}) (i) ' –

+0

@Nick: Merci de m'avoir aidé à ce sujet – Legend

0

Avez-vous essayé i faire une variable globale:

Change:

for(var i = 0; i < data.length; i++) { 
    var query = base_url + data[i]; 
    $.ajax({ 
     url: query, 
     type: 'GET', 
     dataType: 'jsonp', 
     timeout: 2000, 
     error: function() { self.html("Network Error"); }, 
     success: function(json) { 
      $("#li" + i).html("<img src='" + json.result.list[0].url + "' />") 
     } 
    }); 
} 

à ceci:

for(i = 0; i < data.length; i++) { 
    var query = base_url + data[i]; 
    $.ajax({ 
     url: query, 
     type: 'GET', 
     dataType: 'jsonp', 
     timeout: 2000, 
     error: function() { self.html("Network Error"); }, 
     success: function(json) { 
      $("#li" + i).html("<img src='" + json.result.list[0].url + "' />") 
     } 
    }); 
} 

Aussi je suis d'accord avec Nick. Vous pouvez d'abord faire une boucle puis envoyer le tableau (JSON) côté serveur à traiter. De cette façon, l'application sera beaucoup plus sensible.

+0

Yes. Just after posting my question. – Legend

+0

I am not disagreeing. Just that I don't have control over the server. – Legend

+0

Legend - Oh I see..maybe making i global may help out – Luke101

0

Je pense que votre problème a trait à la portée.

Vous devriez envelopper la ce qui est dans la boucle en fonction

for(var i = 0; i < data.length; i++) { 
    doAjax(i); 
} 

function doAjax(i) { 
var query = base_url + data[i]; 
    $.ajax({ 
     url: query, 
     type: 'GET', 
     dataType: 'jsonp', 
     timeout: 2000, 
     error: function() { self.html("Network Error"); }, 
     success: function(json) { 
      $("#li" + i).html("<img src='" + json.result.list[0].url + "' />") 
     } 
    }); 
} 

La valeur i pour la fonction de fermeture de success est correctement lié seulement quand il est dans une boucle.

Cela devrait fonctionner. Bonne chance.

+0

Hah, je suppose que quelqu'un a posté la même chose :) –

Questions connexes