2009-09-27 8 views
6

J'utilise jQuery pour analyser un fichier XML et j'essaie de pousser chaque élément du fichier XML vers un tableau en utilisant une boucle jQuery .each. Bizarrement, si j'avertis la valeur du tableau dans la boucle, il sort comme il se doit, mais si j'essaie d'alerter une valeur dans le tableau après que la boucle soit terminée, cela se traduit par "indéfini".Pousser vers un tableau dans une boucle jQuery

Y a-t-il quelque chose d'étrange qui se produit lorsque vous placez des valeurs dans un tableau dans ce type de boucle?


Voici le Javascript:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
    $('image', xml).each(function (i) { 
     splashArray.push($(this).attr("src")); 
    }); 
}); 

alert(splashArray[1]); // Results in undefined 



Voici le XML:

<?xml version="1.0" encoding="UTF-8"?> 
<site>  
    <image src="splash1.jpg" /> 
    <image src="splash2.jpg" /> 
    <image src="splash3.jpg" /> 
    <image src="splash4.jpg" /> 
    <image src="splash5.jpg" /> 
    <image src="splash6.png" /> 
</site> 

Répondre

10

variante correcte:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     alert(splashArray[1]); 
}); 

Dans votre variante d'alerte de code (splashArray [1]); s'exécute avant que ajax n'obtienne le résultat xml, donc splashArray était vide, lorsque vous essayez d'alerter l'élément avec l'index 1. Votre code ne fonctionne bien que pour le mode synchrone, lorsque le thread attend la réponse du serveur. En mode asynchrone, vous devez utiliser la fonction de rappel.

variante avec rappel:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     work_with_splash(); 
}); 

function work_with_splash() { 
    alert(splashArray[1]); 
} 

Ou un autre motif (pseudo-code):

function process(ajax_is_done) { 
    if (!ajax_is_done) { 
     ajax(function (result) { 
      import_result(result); 
      process(true); 
     }) 
    } 
} 
process(); 
+0

Toujours résultats dans undefined ici .. – jakeisonline

+0

Pour moi, il alerte splash2.jpg – Anatoliy

+0

Oui, votre code récupérera correctement un tableau à l'intérieur du bloc $ .get, mais pourquoi ne le récupérera-t-il pas en dehors du $ .get bloc. Peut-être que je n'étais pas clair. Mon problème n'est pas de faire fonctionner alert(), il rend les valeurs de tableau récupérables pour le code plus tard. – cmal

2

Vous avertissez avant le tableau est rempli. Vous devez comprendre que XHR/Ajax est asynchrone (par opposition à synchrone) afin que l'alerte ne s'exécute pas toujours après la fonction de rappel car il faudra quelques secondes pour effectuer la requête HTTP réelle pour récupérer le fichier XML, en alertant à l'intérieur du Le rappel assure qu'il est rempli après que les choses XHR sont faites.

Travaux:

var splashArray = []; 

function fn() { 
    alert(splashArray[1]); 
} 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     fn(); 
}); 

ne fonctionne pas:

var splashArray = []; 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     // this will populate the array almost always AFTER the alert below. 
}); 


alert(splashArray[1]); // this will almost ALWAYS alert BEFORE the callback function is done 
+0

En fait, les deux méthodes semblaient fonctionner correctement, donc le bit dataType n'a pas vraiment d'importance. Êtes-vous sûr que c'est le bon chemin de fichier xml? Peut-être avez-vous besoin d'un parent racine tel que '/xml/splash.xml'? Essayez l'onglet Firebug net pour voir si vous demandez le bon URI. –

+0

Cela fonctionne presque, mais vous ne pouvez toujours pas appeler splashArray en dehors de la.fonction ajax, il en résulte indéfini. – jakeisonline

+0

Je pensais que vous travailliez sur une solution? Et je ne l'ai pas alerté en dehors du rappel, je l'ai alerté à l'intérieur du rappel, donc ça marche et je l'ai testé. –

0

Si vous ne souhaitez pas utiliser un rappel standard, l'autre option est de déclencher un événement jQuery.

Questions connexes