Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu][Javascript] Ajax et variables globales
Auteur Message
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #1
[Résolu][Javascript] Ajax et variables globales
Et me revoilà avec une variable qui m'ennuie profondément...

je vous donne un code complet de test:
fichier .php
Code PHP :
<?php
session_start
();
require_once(
'../Admin/config.php');
$code_html_0='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Supra Online : Test comportement Ajax</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />'
;
//récupération du perso
$req='SELECT `ID_kalidhia`,`CSS`, `Libre`, `Objet` FROM `perso` WHERE `ID`='.$_SESSION["ID_perso"].' LIMIT 1';
$res=mysql_query($req,$base_id) or die ('Erreur de chargement des données du personnage');
if(
mysql_num_rows($res)==1){$perso=mysql_fetch_assoc($res);}
else{} 
//recréer perso
    //CSS
$code_CSS="";
$code_CSS.='<link rel="stylesheet" type="text/css" href="../CSS/Style.css">';
$code_CSS.='<link rel="stylesheet" type="text/css" href="../CSS/mini.css">';
//JS
$code_JS='<script type="text/javascript" src="../Scripts/overlib.js"><!-- overLIB (c) Erik Bosrup --></script>';
$code_menu='</head><body>
<div id="menu">
    <ul>
        <li><a href="entree.php"'
; if($_GET["p"]=="connect"){$code_menu.=' class="actif"';} $code_menu.='><span>Changer de perso</span></a></li>
        <li><a href="index.php?p=perso"'
; if($_GET["p"]=="perso"){$code_menu.=' class="actif"';} $code_menu.='><span>'.$_SESSION["Nom_perso"].'</span></a></li>
        <li><a href="index.php?p=inventaire"'
; if($_GET["p"]=="inventaire"){$code_menu.=' class="actif"';} $code_menu.='><span>Inventaire</span></a></li>
        <li><a href="index.php?p=compet"'
; if($_GET["p"]=="compet"){$code_menu.=' class="actif"';} $code_menu.='><span>Compétences</span></a></li>
        <li><a href="index.php?p=map" title="votre vue"'
; if($_GET["p"]=="map"){$code_menu.=' class="actif"';} $code_menu.='><span>Carte</span></a></li>
        <li><a href="index.php?p=lieu"'
; if($_GET["p"]=="lieu"){$code_menu.=' class="actif"';} $code_menu.='><span>Lieu</span></a></li>
        <li><a href="index.php?p=messagerie"'
; if($_GET["p"]=="messagerie"){$code_menu.=' class="actif"';} $code_menu.='><span>Messagerie</span></a></li>
        <li><a href="index.php?p=journal"'
; if($_GET["p"]=="journal"){$code_menu.=' class="actif"';} $code_menu.='><span>Journal de bord</span></a></li>
        <li><a href="index.php?p=compagnie"'
; if($_GET["p"]=="compagnie"){$code_menu.=' class="actif"';} $code_menu.='><span>Compagnie</span></a></li>
        <li><a href="index.php?p=guilde"'
; if($_GET["p"]=="guilde"){$code_menu.=' class="actif"';} $code_menu.='><span>Guilde(s)</span></a></li>
        <li><a href="index.php?p=option"'
; if($_GET["p"]=="option"){$code_menu.=' class="actif"';} $code_menu.='><span>Options</span></a></li>
        <li><a href="../forum/index.php"><span>Forums</span></a></li>'
;
if(
$_SESSION["Admin"]==1){$code_menu.='<li><a href="../Dvlpt/index.php"><span>Administration</span></a></li>';}
        
$code_menu.='<li><a href="../index.php?action=Déconnecter"><span>Déconnection</span></a></li>
    </ul>
</div>
        <div id="content">'
;
$code_JS.='<script type="text/javascript" src="test_ajax_comportement.js"></script>';
//calcul X et Y
$X=$perso["ID_kalidhia"]%190;
$Y=floor($perso["ID_kalidhia"]/190);

$requete="SELECT ID, Nom, x, y FROM ville WHERE x=".$X." AND y=".$Y;
//echo '<p class="info">Requête : '.$requete.'</p>';
$resultat=mysql_query($requete,$base_id) or die ('[Lieu] Requête impossible : '.mysql_error());
if(
mysql_num_rows($resultat)==0)
{
    
//echo '<p class="info">Vous ne vous trouvez pas sur un lieu particulier</p>';
    //donc, carte normale... génération, ou pas?
    
include ('mini_map_controle.inc.php');
    
//récupérer le dernier ID du chat au chargement
    
$res=mysql_query('SELECT `ID` FROM `chat_kalidhia` ORDER BY `ID` DESC LIMIT 1',$base_id);
    if(
mysql_num_rows($res)==1){$d=mysql_fetch_assoc($res); $last_IDchat=$d["ID"]; mysql_free_result($res);}
    else{
$last_IDchat=0;}
    
//affichage
    
echo $code_html_0.$code_CSS.$code_JS.$code_menu;

    
    
//quoiqu'il arrive, on rentre en mini-carte
    
echo '<div>Votre position continent : X='.$X.'/ Y='.$Y.'</div>';
    echo 
'<div id="barre_comp"></div>';    
    echo 
'<div id="carte"><img src="images/ajax-loader.gif" /></div>';

    echo 
'<div id="mini-move">';
    include(
'mini_map_mouvement.inc.php');                
    echo 
'</div>';
    echo 
'<span class="info" id="msg" style="border: double 3px black;">messages de retour</span>';
    echo 
'<span class="info" id="info"></span>';
    echo 
'<div class="info" id="sortie"></div>';
    echo 
'</div>';
    
//debug
    
echo '<input type="button" id="test" onClick="alert(\'Décor demandé (12)= \' + load_decor(12));" value="test decor" />';
    
//les appels ajax
    
echo '<script language="javascript">show_decor();var rep=load_decor("5,8,12"); SetDiv(rep,"info"); show_decor();</script>';
}
?>

un fichier .js intégré:
Code PHP :
var t_decor = new Array();
var 
t_decor_2 = new Array();
var 
mem_d= new Array();

function 
addslashes(str) {
    
str=str.replace(/'/g,''');
    
str=str.replace(/"/g,'\\"');
    str=str.replace(/\\/g,'');
    str=str.replace(/\0/g,'
0');
    return str;
}
function stripslashes(str) {
    str=str.replace(/\\'
/g,'\'');
    
str=str.replace(/"/g,'"');
    str=str.replace(/\\\\/g,'');
    str=str.replace(/\\0/g,'
0');
    return str;
}
function SetDiv(text,div)
{
    if (document.getElementById)
    {
        document.getElementById(div).innerHTML = '';
        document.getElementById(div).innerHTML = text;
    }
    else if (document.all)
    {
        x = document.all[div];
        x.innerHTML = text;
    }
    else if (document.layers)
    {
        x = document.layers[div];
        text2 = '
<class="testclass">' + text + '</p>';
        x.document.open();
        x.document.write(text2);
        x.document.close();
    }
}

function load_decor(liste_ID)
{
    var suivi='
<u>Suivi de la requete Ajax :</u>';
    var cpt = -1;
    //méthode AJAX
    var xhr_object = null; 
    if(window.XMLHttpRequest){xhr_object = new XMLHttpRequest();} // FIREFOX
    else if(window.ActiveXObject){xhr_object = new ActiveXObject("Microsoft.XMLHTTP");}  // IE
    else{alert('
Votre navigateur ne supporte pas les objets XMLHttpRequest');}
    //on spécifie la méthode de transfert des données
    xhr_object.open("GET", '
ajax.load_decor.php?ID=' + liste_ID , true); //synchrone => on affiche rien tant que ce n'est pas chargé
    
//on éxécute la requête
    
xhr_object.onreadystatechange = function()
    { 
        try
        {
            if(
xhr_object.readyState == 4//données reçues!
            
{
                
suivi +='<br />Réponse reçue';
                
SetDiv(suivi,'msg');
                var 
Data xhr_object.responseText;
                
SetDiv(Data'info');
                
// message recu: Etat*detail
                
var reg=new RegExp("[*]+""g");
                var 
tab=Data.split(reg);
                
//on met à jour        
                
if(tab[0]=="KO"){SetDiv('Décor erreur : ' tab[1],'info');}
                else if(
tab[0]=="OK")
                {
                    
//detail contient plusieurs décors séparés par "µ"
                    
reg=new RegExp("[µ]""g");
                    var 
grp=tab[1].split(reg);
                    for 
each(a in grp)
                    {
                        var 
reg=new RegExp("[¤]+""g");
                        var 
d=a.split(reg);
                        
cpt=t_decor.length;
                        
suivi +='<br />Traitement Décor N°' d[0];
                        
SetDiv(suivi,'msg');
                        
t_decor[cpt]= new Array(d[0],stripslashes(d[1]),d[2],d[3],d[4],d[5],d[6],d[7],d[8]);
                        
//ID, nom, Image, Bloc, Hauteur, Largeur, Transparent, Action, remplacement
                        //SetDiv('','info');
                        //test variables
                        
t_decor_2[d[0]]=new Array(d[0],stripslashes(d[1]),d[2],d[3],d[4],d[5],d[6],d[7],d[8]);
                    }
                }
                
suivi +='<br />Fin de la requete';
                
SetDiv(suivi,'msg');
                
suivi='';
                
//affichage du contenu des variables globales
                
for(a in t_decor){suivi +='<br />t_decor['+a+'][0]='+t_decor[a][0]+'<br />t_decor['+a+'][1]='+t_decor[a][1];}
                
SetDiv(suivi,'info');
                
//return cpt;
            
}
               else if(
xhr_object.readyState == 1//données envoyées
            
{
                
SetDiv('Requete préparée','info');
                
suivi +='<br />Requete préparée pour ' liste_ID;
                
SetDiv(suivi,'msg');
                
cpt="_1";
            }
               else if(
xhr_object.readyState == 2//données envoyées
            
{
                
SetDiv('Requete reçue par le serveur','info');
                
suivi +='<br />Requete reçue par le serveur';
                
SetDiv(suivi,'msg');
                
cpt="_2";
            }
            else 
//données en cours
            
{
                
SetDiv('Mise à jour des décors','info');
                
cpt=-2;
                
suivi +='<br />Requete en cours sur ' liste_ID;
                
SetDiv(suivi,'msg');
            }
            
//suivi +='<br />Fin onreadyStateChange()';
            //SetDiv(suivi,'msg');
        
}
        catch(
e)
        {
            
alert("Une exception s'est produite : " e.description);
        }
    } 
    
xhr_object.send(null);
    
suivi +='<br />Envoi de la requete';
    
SetDiv(suivi,'msg');
}

function 
show_decor()
{
    var 
suivi='<u>Données en T_decor:</u>';
    
suivi+='<br />Taille : '+t_decor.length;
    for(
a in t_decor){suivi +='<br />t_decor['+a+'][0]='+t_decor[a][0]+' --- t_decor['+a+'][1]='+t_decor[a][1];}
    
SetDiv(suivi,'sortie');


je ne met pas les sources du fichiers retournant les données des décors demandés.. Testé, il marche au poil.

en résumé... je demande au serveur de me renvoyer les données de 3 décors de la carte. Je les recois, et je les met en mémoire dans deux tableaux: t_decor et t_decor_2 (le premier a un index croissant avec les demandes successives, le second a un index correspondant à l'ID du décor (je teste un peu les deux))

le but étant d'afficher la carte avec le moins de trasnfert cleint/serveur possible. Au déplacement du personnage, je récupère un nouveau "pattern" de carte, je le traite, et je réutilise les décors déjà demandés une fois... et je récupère ceux jamais demandés. Je fais pareil avec monstres, auteurs du chat, etc...
Ca a tjs bien fonctionné, jusqu'à un jour, où bouf, ca a déconné.
Depuis, impossible de récupérer ce fonctionnement.

J'ai donc fait ce code pour tester le comportement d'ajax. Ce que je remarque: dans la fonction ajax, les tableaux récupèrent bien les données, je peux meme les afficher. Par conter, une fois la boucle terminée, je me retrouve avec des trucs du genre 't_decor[ID][0] has no properties"

une boucle visant à afficher le contenu des tableaux fonctionne sans erreurs, mais m'affiche une taille=0=> donc aps de données.

Bref: où est mon erreur? la variable globale déclarée en début de script l'est-elle correctement? (j'ai l'impression qu'elle se vide une fois la fonction finie)
Y a-t-il une subtilité avec les fonctions ajax?
bref: need help!!!!!
une semaine que je butte sur ca :(

PS:FireBug me donne bien un contenu aux variables t_decor(_2) (je vois les infos des décors demandés)

attendez, je cherche...
(Ce message a été modifié le : 09-28-2008 11:54 AM par Sephi-Chan.)
09-27-2008 03:08 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #2
RE: Ajax et variables JS globales
je viens de mettre ca sur serveur... prenez le compte test, et aller ici:
http://www.supraonline.be/Jeu/test_comportement.php

a noter qu'il me sort une exception JS undefined... suis bien avancé (EDIT: ok, mauvais fichier uploadé, c'est corrigé)

attendez, je cherche...
(Ce message a été modifié le : 09-27-2008 03:27 PM par Ruz.)
09-27-2008 03:20 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
arcanis Hors ligne
Membre

Messages : 53
Inscription : Sep 2007
Réputation : 1
Message : #3
RE: Ajax et variables JS globales
Intéressant, mais ...
Quelle est la fonction qui plante ? Et quel est le nom de la variable ?

Come to the Dark Side ...
We have cookies ...
— V
09-27-2008 03:43 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #4
RE: Ajax et variables JS globales
aucune fonction ne plante de base, l'execution ici est complète sans erreurs.
par contre, une fois l'appel de load_decor(...) fini, je n'ai plus rien dans les deux tableaux qui m'intéressent: t_decor et t_decor_2

Question: Pourquoi ces tableaux sont-ils vide? (dans le sens, je ne peux accéder à aucune donnée, et leur longueur est annoncée = 0)

attendez, je cherche...
09-27-2008 03:51 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #5
RE: Ajax et variables JS globales
http://www.supraonline.be/Jeu/test_comportement.php si j'affiche le code source de la page, j'ai une page vide.
On test comment ?
09-27-2008 05:37 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #6
RE: Ajax et variables JS globales
euh... attends, je vérifie!

... Bon... perso en ville, condition refusée... je l'ai sorti de la ville 34
c'est bon maintenant.
Il semblerait que la variable soit bien là...
C'est l'accès à ses données qui pose problème, en fait, j'ai l'impression...

ma fonction show_decor(), en gros

attendez, je cherche...
09-27-2008 05:51 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #7
RE: Ajax et variables JS globales
Page toujours vide.
09-27-2008 05:55 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #8
RE: Ajax et variables JS globales
tu t'es connecté avec le compte test, et tu as activé un perso avant d'aller sur la page?
bon, la variable existe donc bien... c'est moi qui n'arrive pas à y accéder...
par contre, j'ai trouvé un script de debuggage qui y accède, et m'affiche son contenu... (bouton rajouté : Debug t_decor)

Code PHP :
function show_decor()
{
    var 
suivi='<u>Données en t_decor (hors fonction):</u>';
    
suivi+='<br />Taille : '+t_decor.length;
    for 
each(a in t_decor){suivi +='<br />t_decor['+a+'][0]='+a[0]+' --- t_decor['+a+'][1]='+t_decor[a][1];}
    
suivi +='<br /> Autre méthode :';
    var 
n=t_decor.length;
    for(var 
x=0x<n;x++){suivi +='<br />t_decor['+x+'][0]='+t_decor[x][0]+' --- t_decor['+x+'][1]='+t_decor[x][1];}
    
SetDiv(suivi,'sortie');

Qu'est-ce qui n'est pas correct???

EDIT: ja rajopute la fonction de debug... si ca aide quelqu'un 34
Code PHP :
function debug(array)
{
    if(
debug.caller!=debug) {
       
contenu "DEBUT ARRAY \n";
    }
    var 
indexParent =  debug.arguments.length==2?debug.arguments[1]:"";
    for(var 
x=0;x<array.length;x++)
    {
        if(
IsArray(array[x])){debug(array[x],(indexParent+"["+x+"]"));}
        else{
contenu += indexParent.replace(/./g,'.') + 'array' indexParent '[' '] = ' + array[x] + "\n";}
        
        if (!
indexParent) {
           
contenu += "FIN ARRAY \n";
           
alert(contenu);
        }
    }


function 
IsArray(obj
{
    if (
obj.constructor.toString().indexOf("Array") == -1) return false;
    else return 
true;


attendez, je cherche...
09-27-2008 06:06 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #9
RE: Ajax et variables JS globales
Si tu es pas capable de rendre ta page de test plus simple d'accès, ça ne m'intéresse pas 4

Obligé de se logguer, de cliquert je ne sais pas où, etc.
C'est une page de test je le rappel.
Tu devrais initialiser toutes les variables dont tu as besoin dans la page.
09-27-2008 08:10 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ruz En ligne
Membre

Messages : 182
Inscription : Apr 2008
Réputation : 1
Message : #10
RE: Ajax et variables JS globales
initialiser, oui...
mais a tester, je préfère tester en condition la plus proche possible du cas final...

d'autre part, tu as tout le code nécessaire dans le premier message...
mais bon, vais tenter de te synthétiser le principal dans une page plus simple...

attendez, je cherche...
09-27-2008 08:32 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS