Ajax et IE6 [Résolu]

Signaler
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010
-
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010
-
Bonjour,
Voila, j'ai un problème assez étrange avec IE6 en utilisant le XMLHttpRequest : au bout de quelques appels, il ne réagit plus... jusqu'a ce qu'il tombe en timeout, et ensuite, ca refonctionne! Le probleme ne provient pas du serveur apache (easyPHP en local), car pendant que ca pédale dans la semoule, ca fonctionne tres bien sous FireFox... J'ai fait des tests (sur une autre machine) sous IE7, et la, pas de probleme. Jamais eu de probleme non plus avec FF.
Les symptômes : 
  * Un ou plusieurs appels ajax se passent tres bien
  * A un moment donné (je n'ai pas pu constater de "nombre d'appels critique", des fois c'est au 2eme, des fois au 15eme...), le raffraichissement de la page ne se termine pas (des images de se chargent pas, alors que les memes sont affichées un peu au dessus dans un tableau (liens modifier/supprimer)... en toute logique avec la mise en cache elles devraient etre affichées non?), et tous les appels ajax suivants ne donnent plus rien. Parfois ca va jusqu'au figeage de la page (plus aucun des éléments de la page ne répond, le curseur ne change pas en passant sur les zones de saisie ou les liens, impossible de scroller, mais le menu de IE répond bien, il est possible de fermer IE), et parfois meme jusqu'au figeage complet de IE (assez rare quand meme)
  * Je recoit un timeout pour chaque appel ajax qui a foiré (status 12002, apres une dizaine de minutes)
  * Les appels ajax fonctionnent de nouveau correctement... jusqu'au prochain "plantage"

Un peu de code :

Fonction effectuant l'appel ajax :

var httpRequest = false; //variable globale pour économiser la mémoire (aussi testée en local, meme probleme)
function makeRequest(url, param, async)
{
   if (!httpRequest)
  {
    if (window.XMLHttpRequest) // Mozilla, Safari,...
    {
      httpRequest = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) // IE
    {
      try
      {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e)
      {
        try
        {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {}
      }
    }
  }
 
  if (!httpRequest)
  {
    alert('Abandon : Impossible de créer une instance XMLHTTP');
    return false;
  }
       



  httpRequest.open('POST', url, async); // tous les appels a cette fonction se font avec async = true. J'ai aussi testé en synchrone, meme probleme. Testé également avec une methode GET : meme probleme.
  httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');



  if (async == true)    httpRequest.onreadystatechange alertContents; //fonction callback. Essayé en la placant avant le open ou apres le send> idem.



  httpRequest.send(param);

  if (async == false)
    alertContents();



  return true;
}



Les appels a makeRequest se font sous cette forme :



  var DateDebut = document.getElementById("HeuresDateDebut").value;
  var DateFin = document.getElementById("HeuresDateFin").value;
  var Employeur = document.getElementById("CritereEmployeurINPUT").value;
  var Client = document.getElementById("CritereClientINPUT").value;
  var Projet = document.getElementById("CritereProjetINPUT").value;
 
  makeRequest('SendData.php', 'page=heures&op=select&DateDebut=' + DateDebut + '&DateFin=' + DateFin + '&Employeur=' + Employeur + '&Client=' + Client + '&Projet=' + Projet + '&OrderBy=' + ColTri + '&Sens=' + SensTri, true);



Fonction callback :



function alertContents()// testé en passant le HXR en parametre quand déclaré en local dans la fonction précédente : meme probleme.
{
  if (httpRequest.readyState == 4)
  {
    if (httpRequest.status == 200)
    {
      if (trim(httpRequest.responseText) != '')
      {
        if (httpRequest.responseXML != null)
        {
          TraiteReponseRequest(httpRequest.responseXML);// traitement des données xml (je met pas le code ici car beaucoup de choses, et a priori le probleme ne vient pas de la)
        }
        else
        {
          alert(httpRequest.responseText);
        }
      }
      else
      {
        alert('Un problème est survenu avec la requête (pas de réponse).');
      }
    }
    else
    {
      alert('Un problème est survenu avec la requête (status:'+ httpRequest.statusText +').'); // on récupere un status 12002 ici quand le xhr se met a "délirer" sous IE6
    }
  }
}







Génération du XML en php (simplifié car il y'a de nombreux cas de figure) :



  header('Content-Type: text/xml'); 

  // Création de l'objet Xml
  $rep = new DOMDocument("1.0");
     $Sens ($_POST['Sens'] 0)? 'ASC' : ' DESC';
     $SQL = "SELECT RowID,
                 DATE_FORMAT(DateDebut, '%d/%m/%Y') as DateDebut,
                 DATE_FORMAT(DateFin, '%d/%m/%Y') as DateFin,
                     NbreJours,
                     NbreHeures,
                     Employeur,
                     Client,
                     Projet,
                     Remarques,
                     MontantBrut,
                     MontantNet,
                     ContratRecu,
                     FeuilletAssedic
              FROM heures
              WHERE UId  = '$UID'
              AND   DateDebut >= str_to_date('".$_POST['DateDebut']."', '%d/%m/%Y')
              AND   DateDebut <= str_to_date('".$_POST['DateFin']."', '%d/%m/%Y')
              AND   LOWER(Employeur) LIKE '".strtolower($_POST['Employeur']) ."%'
              AND   LOWER(Client) LIKE '".strtolower($_POST['Client']) ."%'
              AND   LOWER(Projet) LIKE '".strtolower($_POST['Projet']) ."%'
     ORDER BY ".$_POST['OrderBy']." ".$Sens;
      
     if ($Result =  mysql_query($SQL))
     {
       $RowNum = -1;
        $xml  ="<resultset>\n";
        $xml .="\t<header>\n";
        $xml .="\t\t<resultat>OK</resultat>\n";
        $xml .="\t\theures

\n";
        $xml .="\t\t<op>select</op>\n";
        $xml .="\t</header>\n";
        $xml .="\t<dataset>\n";





 



        while ($Row = mysql_fetch_row($Result))
        {
          $RowNum = $RowNum + 1;
          $RowId       = $Row[0];          $DateDebut   utf8_encode(htmlspecialchars(($Row[1] '') ? '&nbsp;' : htmlentities($Row[1], ENT_QUOTES)));          $DateFin     utf8_encode(htmlspecialchars(($Row[2] '') ? '&nbsp;' : htmlentities($Row[2], ENT_QUOTES)));          $NbreJours   utf8_encode(htmlspecialchars(($Row[3] '') ? '&nbsp;' : htmlentities($Row[3], ENT_QUOTES)));          $NbreHeures  utf8_encode(htmlspecialchars(($Row[4] '') ? '&nbsp;' : htmlentities($Row[4], ENT_QUOTES)));          $Employeur   utf8_encode(htmlspecialchars(($Row[5] '') ? '&nbsp;' : htmlentities($Row[5], ENT_QUOTES)));          $Client      utf8_encode(htmlspecialchars(($Row[6] '') ? '&nbsp;' : htmlentities($Row[6], ENT_QUOTES)));          $Projet      utf8_encode(htmlspecialchars(($Row[7] '') ? '&nbsp;' : htmlentities($Row[7], ENT_QUOTES)));          $Remarques   utf8_encode(htmlspecialchars(($Row[8] '') ? '&nbsp;' : htmlentities($Row[8], ENT_QUOTES)));          $MontantBrut utf8_encode(htmlspecialchars(($Row[9] '') ? '&nbsp;' : htmlentities($Row[9], ENT_QUOTES)));          $MontantNet  utf8_encode(htmlspecialchars(($Row[10] '') ? '&nbsp;' : htmlentities($Row[10], ENT_QUOTES)));
          $ContratRecu = $Row[11];
          $FeuilletAssedic = $Row[12];





 



          $xml .="\t\t<data>\n";
          $xml .="\t\t\t ".$RowNum." \n";
          $xml . ="\t\t\t<RowId>".$RowId."</RowId>\n";
          $xml .="\t\t\t<DateDebut>".$DateDebut."</DateDebut>\n";
          $xml .="\t\t\t<DateFin>".$DateFin."</DateFin>\n";
          $xml .="\t\t\t<NbreJours>".$NbreJours."</NbreJours>\n";
          $xml .="\t\t\t<NbreHeures>".$NbreHeures."</NbreHeures>\n";
          $xml .="\t\t\t".$Employeur."\n";
          $xml .="\t\t\t<Client>".$Client."</Client>\n";
          $xml .="\t\t\t".$Projet."

\n";
          $xml .="\t\t\t<Remarques>".$Remarques."</Remarques>\n";
          $xml .="\t\t\t<MontantBrut>".$MontantBrut."</MontantBrut>\n";
          $xml .="\t\t\t<MontantNet>".$MontantNet."</MontantNet>\n";
          $xml .="\t\t\t<ContratRecu>".$ContratRecu."</ContratRecu>\n";
          $xml .="\t\t\t<FeuilletAssedic>".$FeuilletAssedic."</FeuilletAssedic>\n";
          $xml .="\t\t</data>\n";
  }
  $xml .="\t</dataset>\n";
  $xml .="</resultset>";
   }
   else
   {
        $xml  ="<resultset>\n";
        $xml .="\t<header>\n";
        $xml .="\t\t<resultat>KO</resultat>\n";
        $xml .="\t\theures

\n";
        $xml .="\t\t<op>select</op>\n";
        $xml .="\t</header>\n";
        $xml .="\t<dataset>\n";
        $xml .="\t\t<data>\n";
        $xml .="\t\t\t<erreur>Erreur lors de la recherche des données : " .mysql_error()."</erreur>\n";
        $xml .="\t\t</data>\n";
        $xml .="\t</dataset>\n";
        $xml .="</resultset>";
   }

  // Envoie des données xml
  if ($rep->loadXML($xml))
  {
    echo $rep->saveXML();
  }


Ca fait 3 jours que je farfouille sur le net en long en large et en travers, et j'ai toujours pas trouvé de solution a ce probleme...

Voila, faites moi savoir si il vous faut plus d'infos, je vous met ca des que possible ^^

Merci d'avance,
Seb

18 réponses

Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Grrr de messages mangés...


 


Désolé pour le discours, mais je ne pouvait pas savoir si tu avait des notions d'architecture logicielle, et cela peut également interesser d'autres personnes ;)


 


Pour moi ca ne respecte pas l'architecture multi tiers car le code javascript qui interprete les données attendra du HTML, qui est un


language structurel et non un type de flux de données standardisé, de plus, le remplacement de la couche metier php par une autre technologie impose que celle ci soit capable de sortir du HTML, ce qui est loin d'etre évident. De plus, mon but est de construire une VRAIE application multi-tiers dans un but d'aprentissage, et je ne voit pas en quoi cela aurait pu regler le probleme que je rencontrait...



D'ailleurs, j'ai (enfin!) trouvé l'origine de ce probleme : http://support.microsoft.com/kb/269802/en-us/
Les images générées dynamiquement essayent de se charger simultanément depuis le serveur, en ouvrant une nouvelle connexion pour chacune, et IE se heurte a la limite de connexions par session définie au niveau du serveur. J'ai confirmé que c'etait bien cette cause en différant le chargement des images via un setTimeout, et la, ca fonctionne... Reste plus qu'a trouver une solution acceptable!
Merci Cro$oft...




Merci quand meme de votre aide, et de vos points de vue ;)


Seb
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
bonjour,

tu es sûr que pour "récupérer" du xml ( fut-il créé par php )
    il faut employer ajax ?

j'utilise toujours, pour un fichier xml ( mais jamais utilisé avec création
    de ce xml par php, alors je dis peut-être n'importe quuoi !?! ) :

            function xmlFin()    // Xml chargé
            {    traitement du xml }

            if ( document.implementation && document.implementation.createDocument )
                      {    xmlD = document.implementation.createDocument("", "", null);
                           xmlD.onload = function() {    xmlFin();    }
                      }   
            else     {    xmlD = new ActiveXObject("Microsoft.XMLDOM");   
                           xmlD.onreadystatechange = function ()
                           {    if (xmlD.readyState == 4)    xmlFin(); }
                    }
            xmlD.load("fichier.xml");

Cordialement     Bul  [mon Site] [M'écrire], <!--
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Salut, et merci de ta participation!
C'est, me semble-t'il, le principe de base d'AJAX : Asynchronous Javascript And XML...
Ou alors j'ai loupé un truc quelque part
La propriété responseXML permet justement de récuperer le xml (généré dynamiquement par PHP ou non, et pour autant qu'il s'agisse de xml valide) sous forme d'objet DOM pour le traiter en js, donc l'idée de réinventer la poudre en réécrivant une fonction de chargement de document XML ne m'est meme pas venue a l'esprit en fait... Ceci dit ca pourrait etre une piste interessante pour ne pas passer par un XHR : charger un doc xml qui se génère tout seul a la demande grace a PHP... Cependant ca perd (je pense) les principaux avantages d'ajax : traitement asynchrone coté serveur si le traitement est potentiellement long, ce qui permet de ne pas figer le client le temps du traitement; passage de parametres pour pouvoir filtrer les données a recuperer et ne transferer entre le serveur et le client que le necessaire, plutot que "convertir" la base de données complete en xml, la transmettre au client, et effectuer la recherche dedans...
Après, je sais qu'il est possible d'utiliser le XHR autrement qu'avec du XML : le JSON (envoi de donnée js structurées plutot que de xml), ou envoi de HTML préconstruit par le serveur... Le JSON, je maitrise pas du tout, je connait pas bien, et je trouve que ca perd quand meme l'interet de l'interoperabilité (la page php renvoyant les données ne peut etre appelée QUE par du js, ou alors il faut redécortiquer la réponse pour reconstruire une structure de données... bof bof...), quant au HTML préconstruit... beurk! Que fait-t'on de la séparation des roles?? le serveur est la pour faire du traitement de données, pas de la mise en page ou de l'affichage!

Donc en conclusion, ajax et xml généré par php me parait toujours la meilleurs solution

Seb
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
on est bien d'accord...
mais
j'eus quelques soucis en n'utilisant pas ce que j'utilise,
je n'ai plus IE6,
peut-être est-ce que ça vaut le coup de tester malgré tout,
et sans convertir la base complète ! sans fichier nulle part....
non,non : simplement en laissant tel quel coté php.
malgré tout.. un extrait d'une base de données, la convertir en xml...    je doute.   
php devrait renvoyer des données,
et pas une page complète bien sûr ! c'est le but d'ajax... me semble-t-il.

CordialementBul[mon Site][M'écrire], <!--
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

bonjour ou bonsoir,

je me demande si ton problème ne viendrait pas de cette ligne :
httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
J'ai déjà utilisé ajax avec du xml et j'ai jamais du définir le header pour ce type de requète !
Si tu veux je peux te fournir la librairie que j'utilise avec les fichiers xml.

Nickadele
----------------------------------------------
non, ma belle ne s'appel pas Adèle
Mon Blog
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Oups mon message a été langé en route, je m'en était pas appercu

Je disait donc :

Bul : Je vais faire quelques tests dans ce sens, mais je ne pense pas pouvoir utiliser la méthode POST pour transmettre des données a PHP avec un XMLDOM (meme un GET dans l'URL du load je suis pas sur que ca marche bien...), hors j'ai réellement besoin de la méthode POST pour la sauvegarde de données saisies par l'utilisateur (champ commentaire notament), car la taille maxi des parametres que l'on peut passer en GET risque d'etre trop faible... Toutefois si la méthode GET fonctionne bien, je m'orienterait peut etre vers une solution mixte XMLDOM/ajax en utilisant AJAX uniquement pour la sauvegarde (et en croisant les doigts pour que ca merde pas...), toutefois, je préfererait quand meme n'utiliser que de l'ajax et trouver une solution a ce probleme...

Nick: Cette ligne est necessaire pour l'utilisation de la méthode POST avec XMLHttpRequest, et je l'avait mise en commentaire quand j'avait tester la methode GET, sans plus de succes... Ce n'est donc pas elle la responsable!

Merci,
Seb
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

(Je comprend pas ce qui se passe, ca me bouffe mes messages, il n'y a que la signature qui est inserée... Si un modérateur passe par la, s'il peut faire un peu de ménage... Merci a lui, et désolé pour ce bazard ^^')

Seb
Messages postés
26
Date d'inscription
vendredi 16 juin 2006
Statut
Membre
Dernière intervention
13 octobre 2008

je crois que ton problème viens des \n et \t que tu ajout dans le fichier php;

j'avais le même problème hier et la cause été les \n

bonne chance
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

saib,

1. j'ai nettoyé les posts vide (ce problème arrive de temps en temps) !
2. j'ai toujours une librairie à ta disposition si tu souhaites faire des tests avant de changer de méthode.

Nickadele
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

mnouzahir : Concernant les /t et /n, il ne s'agit que de formattage du xml (tabulations et retours chariot), normalement, ca ne devrait pas poser de probleme, et pour autant que je sache c'est tout a fait authorisé, mais soit, je testerait ce soir (je n'ai pas IE6 au taf mais IE7, qui lui ne pose aucun probleme)...

nick : J'ai essayé de virer le header 'application/x-www-form-urlencoded' en conservant la méthode POST, et comme je m'y attendait, ca ne fonctionne pas (aucune réponse, que ce soit sous IE7 ou FF). Je veut bien tester ta librairie, mais si elle n'utilise pas ce header je doute qu'elle soit capable de gerer du POST, a moins qu'on ne puisse définir le header dans les options de l'objet, comme j'ai pu le voir dans quelques méthodes par prototypage... Toujours est-il que si ca fonctionne avec, ca m'arrangerait bien quand meme :-)

Seb
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

Pour l'appel :
new Ajax_request('files/monfichier.xml',{method:'post',params:param ,onSuccess:mafonction,async:true});

ou

new Ajax_request('files/mapage.php',{method:'get',params:param ,onSuccess:mafonction,async:true});

ou
new Ajax_request('files/mapage.php',{method:'get',params:param ,onSuccess:mafonction,onError:mafonctionerror});

ou

toute combinaison logique

La fonction qui récuprère le xml :
mafonction(xhr){
var noeudxml = xhr.responseXML.getElementsByTagName("resultat");
}

A mettre dans un fichier *.js

//
// Librairie by The Rubik's Man
// © 2005-2006
//

var Ajax_request = function() {
this.request.apply(this, arguments);
}
Ajax_request.prototype = {

request: function (url, options) {
this.getObject();

if ( typeof(options) 'undefined' ) options new Array();
if ( typeof(options) == 'object' ) {
method = options['method'] || 'post';
successEnd = options['onSuccess'] || this.debugSuccessMessage.bind(this);
errorEnd = options['onError'] || this.defaultErrorMessage.bind(this);
paramString typeof(options['params']) 'undefined' ? '' : (options['method'] == 'get' ? '?'+options['params'] : options['params']);

if ( typeof(options['async']) != 'undefined' && typeof(options['async']) != 'boolean' ) {
alert('si la valeur de \'async\' est definie, elle doit etre de type booleen');
return;
}
else async typeof(options['async']) 'undefined' || typeof(options['async']) != 'boolean'? true : options['async'];

this.setProperties(method,successEnd,errorEnd,paramString,async);
}

if ( typeof(url) != 'string' ) {
alert('url de format invalide ( l\'url est obligatoire )');
return;
}
else this.properties['url'] = url;

this.setReadyProcess();
this.processRequest();
},


getObject: function() {
if(window.XMLHttpRequest) this.Ajax_object = new XMLHttpRequest();
else if (window.ActiveXObject) {
try {
this.Ajax_object = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
this.Ajax_object = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e1) {
this.Ajax_object = null;
}
}
}
else {
alert("AJAX impossible sur votre navigateur");
}
this.properties = new Array();
},

setProperties: function() {
this.properties = {
method : arguments[0],
successEnd : arguments[1],
errorEnd : arguments[2],
paramString : arguments[3],
async : arguments[4]
}
},

setReadyProcess: function() {
this.Ajax_object.onreadystatechange = function() {
if (this.Ajax_object.readyState == 4 ) {
responseText = this.Ajax_object.responseText;
responseXML = this.Ajax_object.responseXML;
this.responseText = this.Ajax_object.responseText;
this.responseXML = this.Ajax_object.responseXML;
if ( this.Ajax_object.status == 200 ) this.properties['successEnd'](this.Ajax_object);
else this.properties['errorEnd'](this.Ajax_object);
}
}.bind(this);
},

defaultErrorMessage: function(xhr) {
alert('Error ' + xhr.status + ' -- ' + xhr.statusText);
},

debugSuccessMessage: function(xhr) {
alert('Reponse texte\n\n'+xhr.responseText);
},

processRequest: function() {
this.Ajax_object.open(
this.properties['method'],
this.properties['method'] == 'post' ?
this.properties['url'] : this.properties['url']+this.properties['paramString'],
this.properties['async']
);
if ( this.properties['method'] == 'post' )
this.Ajax_object.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
this.Ajax_object.send(this.properties['method'] == 'post' ? this.properties['paramString'] : null);
}

}
Function.prototype.bind = function(object) {
var __method = this;
return function() {
return __method.apply(object, arguments);
}
}

var responseText = new String();
var responseXML = new Object();

//
// Librairie by The Rubik's Man
// © 2005-2006
//
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Merci, je vais tester ca, mais ce soir je vais pas avoir le temps pour cause de PC malade (vive les recherches sur gougeul et les sites truffés de cochonneries  )... Des qu'il est guerri j'essaie!
Par contre, juste une petite remarque : le header 'application/x-www-form-urlencoded' est appliqué par l'objet dans le cas d'une méthode post ;)

Seb
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

oui j'ai vu qu'il était appliqué par défaut !
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Me revoila!
Alors, apres de nouveaux tests, le retrait des \t et \n du code php qui génère le xml n'a rien changé, l'utilisation de l'objet de nick n'a rien changé, l'utilisation d'un autre objet ajax encore plus complet qui m'a été fourni sur un blog n'a rien changé... Je vais finir par mettre un message du genre "Si vous rencontrez des problemes avec ie6, passez a firefox!" sur le site... Nan vraiment, la, je sais plus...
Et sinon, deux remarques sur cet objet nick :
- le onReadyStateChange est affecté avant le open(), ce qui peut etre source de problemes dans certains cas de figure. L'idéal semble t'il est de l'affecter entre le open() et le send().
- l'objet n'est pas détruit apres retour de la réponse et traitement des données (this.properties['successEnd'](this.Ajax_object)), ce qui peut conduire a des memory leaks sur certains navigateurs, a moins de gerer la libération de l'objet par ailleurs...

Seb
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

Bonsoir,
Bon, alors apres pleeeeein de tests, il semblerait (j'en suis pas encore sur), que ca n'ait en fait rien a voir avec le xmlhttprequest, mais que ce soit du au chargement des images dans le tableau... Quand je remplace ces images par du texte je n'ai (pour le moment) plus le probleme...

Voici le code utilisé pour alimenter le tableau :

function HeuresRefreshFullTable2(XmlData)
{
  var OldBody, NewBody;
  var Row, Cell, Img, Link;
  var Index, RowID, DateDebut, DateFin, NbreJours, NbreHeures, Employeur, Client,
      Projet, Remarques, MontantBrut, MontantNet, ContratRecu, FeuilletAssedic;




 





  OldBody = document.getElementById("ScrollTable").getElementsByTagName("tbody")[0];
 
  NewBody = document.createElement("tbody");
 
 
  for (var i=0; i<XmlData.length; i++)
  {
    RowID = XmlData[i].getElementsByTagName("RowId")[0].childNodes[0].nodeValue;
    Index = XmlData[i].getElementsByTagName("index")[0].childNodes[0].nodeValue;
    DateDebut = XmlData[i].getElementsByTagName("DateDebut")[0].childNodes[0].nodeValue;
    DateFin = XmlData[i].getElementsByTagName("DateFin")[0].childNodes[0].nodeValue;
    NbreJours = XmlData[i].getElementsByTagName("NbreJours")[0].childNodes[0].nodeValue;
    NbreHeures = XmlData[i].getElementsByTagName("NbreHeures")[0].childNodes[0].nodeValue;
    Employeur = XmlData[i].getElementsByTagName("Employeur")[0].childNodes[0].nodeValue;
    Client = XmlData[i].getElementsByTagName("Client")[0].childNodes[0].nodeValue;
    Projet = XmlData[i].getElementsByTagName("Projet")[0].childNodes[0].nodeValue;
    Remarques = XmlData[i].getElementsByTagName("Remarques")[0].childNodes[0].nodeValue;
    MontantBrut = XmlData[i].getElementsByTagName("MontantBrut")[0].childNodes[0].nodeValue;
    MontantNet = XmlData[i].getElementsByTagName("MontantNet")[0].childNodes[0].nodeValue;
    ContratRecu = XmlData[i].getElementsByTagName("ContratRecu")[0].childNodes[0].nodeValue;
    FeuilletAssedic = XmlData[i].getElementsByTagName("FeuilletAssedic")[0].childNodes[0].nodeValue;





 





    Row = document.createElement('tr');
    Row.style.height = '20px';
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = DateDebut;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = DateFin;





 



    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = NbreJours;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = NbreHeures;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = Employeur;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = Client;





 



    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = Projet;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = Remarques;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = MontantBrut;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Cell.innerHTML = MontantNet;
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    if (ContratRecu == 1)
    {
      Img = document.createElement('img');
      Img.src = "style/check.gif";
      Img.style.height = '10px';
      Img.style.width = '10px';
      Img.alt = '';
      Cell.appendChild(Img);
    }
    else
      Cell.innerHTML = '&nbsp;';   
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    if (FeuilletAssedic == 1)
    {
      Img = document.createElement('img');
      Img.src = "style/check.gif";
      Img.style.height = '10px';
      Img.style.width = '10px';
      Img.alt = '';
      Cell.appendChild(Img);
    }
    else
      Cell.innerHTML = '&nbsp;';   
   
    Cell = document.createElement("td");
    Row.appendChild(Cell);





 



    Link = document.createElement('a');
    Link.href = "#";
    Link.onclick = new Function('HeuresClickChange(' + Index + ', ' + RowID +')');
   
    Img = document.createElement('img');
    Img.src = "style/edit.gif";
    Img.style.height = '16px';
    Img.style.width = '16px';
    Img.style.border = 'none';
    Img.alt = 'Modifier';
    Link.appendChild(Img);
    Cell.appendChild(Link);
    
    Cell = document.createElement("td");
    Row.appendChild(Cell);
    Link = document.createElement('a');
    Link.href = "#";
    Link.onclick = new Function('HeuresClickDelete(' + Index + ', ' + RowID +')');
   
    Img = document.createElement('img');
    Img.src = "style/delete.gif";
    Img.style.height = '16px';
    Img.style.width = '16px';
    Img.style.border = 'none';
    Img.alt = 'Supprimer';
    Link.appendChild(Img);
    Cell.appendChild(Link);
    
    NewBody.appendChild(Row);
  }
 
  //ligne vide en fin de tableau pour un bon affichage
  Row = document.createElement("tr");
 
  for (var i=0; i<NbColTableHeures; i++)
  {
    Cell = document.createElement("td");
    Row.appendChild(Cell);
  }
    
  NewBody.appendChild(Row);






 



  document.getElementById("ScrollTable").replaceChild(NewBody, OldBody);





}









* Apparament les images sont toutes rechargées depuis le serveur plutot que d'etre mises en cache... Bon, ca j'veut bien croire que ce soit un probleme de config d'ie6, vu que je l'ai modifiée pour virer tout le bazard qu'il stocke dans les temporary internet files et qui finit par prendre des gigas...
* A un moment (aléatoire?), le chargement des images se bloque, et c'est comme si le serveur ne répondait plus, sauf que si j'ouvre une nouvelle fenetre ie, le serveur répond tres bien... Si sur la fenetre "bloquée" je change de site (gougeul par exemple), ca marche, je revient sur ma page en question, toujours bloquée.
* Au bout d'un moment (timeout), il finit par laisser tomber et m'affiche la petite croix rouge dans la page blanche de "peut pas charger l'image", un clic droit -> afficher l'image affiche bien l'image (mais uniquement celle la, pas les autres images du tableau ayant pourtant le meme src), et un nouveau raffraichissement de tableau fonctionnera de nouveau...

On dirait que le chargement des images plante la session php en fait... mais uniquement sur ie6!

Des idées pour solutionner ca?
(Et au passage, y'a pas d'autres méthodes plus rapides pour generer des objets DOM? parceque sous ie... c'est leeeent... J'avait bien pensé au innerHTML mais c'est pas tres W3C semblerait-il...)

Merci!

Seb
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

Juste une petite question : Pourquoi générer un xml coté serveur qui est ensuite traité coté client pour générer du html ? Pourquoi ne pas générer le html directement coté serveur ?

Nickadele
Messages postés
38
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
15 mars 2010

C'est là tout le principe de l'architecture n-tiers (souvent réduite a 3 tiers) : séparation des taches. Le HTML est le support, le css s'occupe de la mise en page et de la présentation, le javascript gere le traitement des données reçues du serveur et l'alimentation de la page (+ un certain nombres de choses infaisables en css comme des menus dynamiques par exemple, et c'est la qu'il est important de bien séparer le code utilisé pour la présentation du code "metier", idéalement dans des fichiers séparés), PHP est la couche metier et s'occupe de l'acces aux données, de leurs mise a jour, et des traitement a effectuer sur ces données, et la base de données ne gere que le stockage des données pur et simple.
Les gros interets de ce type d'architecture sont entre autres l'interoperabilité et l'interchangeabilité:
- Interopérabilité : l'utilisation d'un format de données standard comme le XML coté serveur permet de s'y connecter depuis n'importe quel type d'interface (executable, rss, javascript via ajax, flash, etc...). Inversement, n'importe quelle source XML peut alimenter ce systeme.
- Interchangeabilité : chaque couche d'une telle architecture peut etre facilement remplacée par une autre technologie pour améliorer les performances, la stabilité, l'experience utilisateur... On peut imaginer toutes sortes de combinaisons : passage a un serveur Oracle, dévellopement d'une interface client en flash, dévellopement d'un module "light" pour PDA ou téléphone portable, etc...
Cette architecture favorise également l'implémentation d'un suport multi-langues, et permet d'assurer la maintenance facilement.
Il éxiste d'autres approches architecturales de conception d'application, et a vrai dire, je ne pense pas qu'on puisse dire qu'il y'en ait de meilleures que d'autres, ça dépend surtout de l'ampleur du projet et du type d'application (locale, réseau, web, avec base de données ou non, etc...).
Plus d'infos ici : http://fr.wikipedia.org/wiki/Architecture_trois_tiers et http://fr.wikipedia.org/wiki/Architecture_logicielle

Dans mon cas, la couche présentation est composée de HTML + CSS + javascript, la couche metier est assurée par PHP, et l'acces aux données par une base MySQL.

On peut débattre de l'utilité d'utiliser ce type d'architecture (ou meme d'utiliser une architecture) pour un simple site web, mais disons que je le fait dans un but d'apprentissage. Je suis dévellopeur application (sous Delphi principalement), et je voudrait me mettre au dévellopement d'aplications web structurées, donc voila, c'est un petit projet qui me parrait pas mal pour ca ^^ (Sans compter que ca rendra service aux intermittents du spectacle!)

Voila, j'espere avoir répondu a tes interrogations ;)
Seb
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

saib,

j'avais pas besoin d'un discours sur l'architecture 3 tiers.
Je crois que tu appliques un peu trop à la lettre ce principe.
Je m'explique, tu peux coté serveur respecter cette architecture tout en fournissant des services qui fournissent des données placées dans du html ou du xml.
Ex : une fonction serveur qui te fournit la liste des pays en format XML et une autre fonction qui te fournit les mêmes données mais avec les balises html.
Ceci n'est pas incompatible avec l'architecture 3 tiers.

Nickadele