2010-12-16 153 views
4
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

Répondre

7

Ce n'est pas un problème de portée. Cela peut être dû à la nature asynchrone des appels AJAX.

La première lettre de l'Ajax est synonyme de « asynchrone », ce qui signifie que l'opération se produit en parallèle et l'ordre d'achèvement est pas garantie. L'option async à $ .ajax() par défaut à true, indiquant que l'exécution du code peut continuer après la demande est faite. Si vous définissez cette option sur sur false (et que l'appel n'est donc pas plus asynchrone) est fortement déconseillé, car il peut provoquer l'absence de réponse du navigateur .

jQuery.ajax()

+2

+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. –

+1

Oui, vous devez mettre tout ce que vous faites avec field1 et field2 dans le callback complet. – Mark

+0

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

0

C'est question principalement le choix du moment

votre code ajax ne reçoit pas exécuté au moment où vous appelez ces variables

alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox 
alert(field2);/

pour résoudre le problème font l'appel ajax en le document.ready et après que vous pouvez alerter filed1 et field2,

Je suis très sûr que c'est le problème de synchronisation en raison de la nature asynchrone d'ajax