IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Valeur de variable globale indisponible dans d'autre fonction js (AJAX)


Sujet :

AJAX

  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut [AJAX] Valeur de variable globale indisponible dans d'autre fonction js (AJAX)
    Bonjour tout le monde,

    Je suis dans une page javascript A, j'appelle une fonction javascript (AJAX) dans une page B :

    Page A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(document.getElementById(id_cb).checked)
    	{
    		nombre_ects_dans_bd = check_ects(matricule,valeur_cb);
    		alert("ici" + total_ects_bd);		
    	}
    Page B :

    J'ai déclaré une variable globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var total_ects_bd = 0; 
    function check_ects(matricule,valeur_cb)
    {
    le retour dans la page B est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    xhr.onreadystatechange = function()
    	{
    		if(xhr.readyState == 4 && xhr.status == 200)
    		{
    			total_ects_bd = xhr.responseText;
    			//return total_ects_bd;
     
    		}
    Si je fais un alert dans A de la variable globale total_ects_bd j'obtiens toujours 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert("ici" + total_ects_bd);
    Sauriez-vous svp me dire ce que je n'ai pas bien fait ?

    Merci d'avance.

    beegees

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Je n'ai pas tout saisi de tes page A et page B mais par contre ce qui doit se passer c'est que si ton appel AJAX est asynchrone, alors tu affiches ton alert mais le retour d'AJAX n'a pas encore eu lieu ... C'est pour ces raisons qu'on passe une fonction de rappel à onreadystatechange en cas d'appel asynchrone.

    ERE

  3. #3
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Les pages A et B sont bien deux pages web distinctes, c'est ça ?
    Si c'est le cas, effectivement les variables ne sont pas accessibles de l'une à l'autre car chaque (re)chargement de page détruit et reconstruit le contexte de page JS.
    Par contre, il y a des solutions pour conserver des données de page en page, dont la plus "classique" (à voir en fonction de ton contexte si c'est la solution à adopter) est de passer des params dans l'URL qui passe d'une page à l'autre... (sinon il y a les cookies de session, l'écriture dans un fichier sur le serveur que tu interrogerais par ajax...)

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Les pages A et B sont bien deux pages web distinctes, c'est ça ?
    C'est justement la question que je me suis posée. Mais si c'est le cas, pourquoi le code ne plante pas à l'appel de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre_ects_dans_bd = check_ects(matricule,valeur_cb);
    étant donnée que celle-ci n'existe pas dans A ?

    ERE

  5. #5
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    J'ai un doute ^^
    Page A et page B sont peut-être des js distincts appelés depuis le head d'une page unique... si c'est le cas je suis hors-sujet là

    Beegees ? ^^

  6. #6
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Salut,

    Merci à vous deux pour vos réponses.

    Voici plus de détails :

    page Enregistrer_cours.js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function mise_a_jour_cours(id_cb,valeur_cb,matricule,filiere)
    {	
    	//alert("this.id vaut " + id_cb);
    	//je vérifie si la checkbox cliquée à été cochée ou décochée
    	//je ne fait le check que si c'est coché car si c'est pas coché, on va quand même soustraire
    	if(document.getElementById(id_cb).checked)
    	{
    		nombre_ects_dans_bd = check_ects(matricule,valeur_cb);
    		if(total_ects_bd > 10)alert("pas ok");
    	}
    J'appelle donc une fonction nommée check_ects

    page check_ects.js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    var total_ects_bd = 0; 
    //cette fonciton me permet de vérifier le nombre d'ECTS déjà présent dans la bd au cas ou un etudiant choisirait des cours dans deux browsers differents avant de rafraichir
    function check_ects(matricule,valeur_cb)
    {
    	var xhr = getXhr();
    	xhr.onreadystatechange = function()
    	{
    		if(xhr.readyState == 4 && xhr.status == 200)
    		{
    			total_ects_bd = xhr.responseText;
    			alert(total_ects_bd);
     
    		}
    	}
     
    	xhr.open("POST","AJAX/check_ects.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send("matricule="+matricule+"&valeur_cb="+valeur_cb);
     
    }
    Le retour est par exemple 10 mais dans la première page c'est toujours 0.

    Merci encore à vous deux.

    beegees

  7. #7
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    J'ai un doute ^^
    Page A et page B sont peut-être des js distincts appelés depuis le head d'une page unique... si c'est le cas je suis hors-sujet là

    Beegees ? ^^
    oui, appelés depuis un head unique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <script type="text/javascript" src="AJAX/Enregistrer_Filiere.js"></script>
    <script type="text/javascript" src="AJAX/Enregistrer_cours.js"></script>
    <script type="text/javascript" src="AJAX/nom_prenom.js"></script>
    <script type="text/javascript" src="AJAX/ECTS.js"></script>
    <script type="text/javascript" src="AJAX/cloture.js"></script>
    <script type="text/javascript" src="PDF/imprimer_CAO.js"></script>
    <script type="text/javascript" src="js/desactiver_cb.js"></script>
    <script type="text/javascript" src="AJAX/check_ects.js"></script>
    beegees

  8. #8
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Beegees, faut être un peu plus précis dans ton vocabulaire...
    Ne parle pas de page javascript A et page B mais de 2 fichiers javascript A et B.

    Du coup je te confirme ce que j'écrivais précédemment sur l'aspect asynchrone.

    Ta variable total_ects_bd est bien globale et initialisée à 0, mais tu affiches ton alert alors que le retour d'AJAX n'a pas encore eu lieu. Tu peux le vérifier en changeant la valeur d'initialisation de total_ects_bd (mets 5 par exemple et tu devrais voir s'afficher 5 dans ton alert).

    Bon dev,

    ERE

Discussions similaires

  1. [AC-2003] Variables globales initialisées dans Form_Load qui perdent leurs valeurs
    Par mamadouabd dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/01/2010, 23h09
  2. Réponses: 3
    Dernier message: 14/05/2009, 17h53
  3. Réponses: 8
    Dernier message: 09/07/2007, 10h18
  4. variable globale fixée dans un registre
    Par gorgonite dans le forum C
    Réponses: 11
    Dernier message: 02/07/2007, 13h42
  5. [Delphi7]Variable global à lire dans Visual Basic
    Par Shifty44 dans le forum Delphi
    Réponses: 3
    Dernier message: 23/10/2006, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo