var field1;
var field2;
function setUserFields() {
$.ajax({
type: "POST",
url: "url",
dataType: "xml",
complete: parseXml
});
}
function parseXml {
$(xml.responseXML).find("myValue").each(function()
{
field1 = $(this).attr('attr1');
field2 = $(this).attr('attr2');
alert(field1 + ' ' field2); //shows correct values
});
}
setUserFields();
$(function() {
alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox
alert(field2); //undefined in IE and Chrome | Gives correct value in FireFox
})
Je ne publie pas le code exact que je cours car le code est assez complexe. S'il y a des erreurs de syntaxe dans le code affiché, ne tenez pas compte car elles ne sont pas la cause de mon problème. Le code fonctionne comme prévu dans Firefox mais pas IE ou Chrome. De plus, je peux vérifier dans Firebug Lite que l'ordre du code ne devrait pas causer de problème. Ce que j'essaie de faire est d'appeler un service Web, analyser les résultats et stocker les informations nécessaires dans une variable globale pour une utilisation dans les fonctions ultérieures que je ne peux appeler qu'après le chargement du DOM. J'exécute la fonction setUserFields avant le chargement du document. La fonction est appelée et définit les variables, mais les variables ne sont disponibles que dans la portée de parseXML(). Puisque j'ai déclaré les variables hors de la portée de toutes les fonctions et que je mets les variables à l'intérieur de la fonction parseXML, je m'attendrais à ce que les variables soient définies globalement. Cependant, seulement dans Firefox je peux accéder aux variables sans qu'elles soient indéfinies. Je suis assez nouveau à l'arène de javascript donc je peux manquer un écueil évident. J'ai essayé de googler pendant quelques heures sans aucune chance. Toute aide serait grandement appréciée.jQuery/javascript variable scope
+1 Ceci ** est ** un problème de synchronisation. Vous ne pouvez pas compter sur une variable globale remplie sur un rappel de succès, en dehors de ce rappel. –
Oui, vous devez mettre tout ce que vous faites avec field1 et field2 dans le callback complet. – Mark
Définir une valeur initiale à la variable et la vérifier pourrait aider. Si 'alert()' affiche une valeur initiale, cela signifie que la portée de la variable est correcte, seul l'appel asynchrone au service web n'est pas encore terminé. – 9000