[Résolu][JS] Cannot read property 'firstChild' of null

Cannot read property 'firstChild' of null [Résolu][JS] - HTML/CSS - Programmation

Marsh Posté le 13-10-2013 à 14:22:15    

Salut à vous ;)
 
Bon, voilà deux jours que je galère avec un script.
Le sujet est la gestion d'un calendrier pour un club sportif.
 
Alors, j'ai un calendrier dans la partie gauche de l'écran avec tous les jours du mois. Quand je clique sur une date, javascript envoie une requête au serveur qui renvoie tous les entraînements de cette date sous format xml.
 
Le code javascript appelé lorsqu'on clique sur une date est le suivant :
 

Code :
  1. function jcalendar(jour)
  2. {
  3. document.getElementById('j_calendar').style.visibility='visible';
  4. jour=jour.toString();
  5. if(jour.length < 2)
  6. {
  7. jour="0"+jour;
  8. }
  9. var selmois = document.getElementById('mois');
  10. var index = selmois.selectedIndex;
  11.  
  12.  
  13. mois = selmois.options[index].value;
  14. moistext = selmois.options[index].text;
  15. var selannee = document.getElementById('annee');
  16. var index = selannee.selectedIndex;
  17.  
  18. annee = selannee.options[index].value;
  19.  
  20. var Xhr_Object = null;
  21. if (window.XMLHttpRequest) // Mozilla
  22. {Xhr_Object = new XMLHttpRequest();}
  23.              
  24. else if(window.ActiveXObject) // Internet Explorer
  25. {Xhr_Object = new ActiveXObject('Microsoft.XMLHTTP');}
  26.                        
  27. else{// XMLHttpRequest non supporté par le navigateur
  28. alert("__IncompatibleXMLHTTP__" );
  29. return;}
  30.   //Récupération du XML sur la page serveur
  31.   var Source = './req_calendrier.php';
  32. //choix de la méthode post pour discuter avec le serveur
  33. Xhr_Object.open('POST', Source, true);
  34. //si mon post est trop lent par rapport au serveur, on doit être prêt à recevoir la réponse du serveur
  35. //4 : le serveur a fini de travailler et a envoyé une réponse.
  36. Xhr_Object.onreadystatechange = function()
  37. {
  38. if(Xhr_Object.readyState == 4)
  39. {
  40.      events += '<h3>Entraînements</h3><p>';
  41.      if(XML_Doc.getElementsByTagName('CompteurEnt').item(0).firstChild.nodeValue<=0)
  42.      {
  43.       events += 'Aucun entraînement prévu à cette date.';
  44.      }
  45.    
  46.      else
  47.      {
  48.    
  49.       for (Index = 0; Index <= XML_Doc.getElementsByTagName('CompteurEnt').item(0).firstChild.nodeValue; Index++)
  50.       {
  51.       var id_ent=XML_Doc.getElementsByTagName('ide').item(Index).firstChild.nodeValue;
  52.    
  53.       //mise en forme de l'heure.
  54.       var hdeb=XML_Doc.getElementsByTagName('hdebe').item(Index).firstChild.nodeValue;
  55.       hdeb=hdeb.toString();
  56.    
  57.      //mise en forme de l'heure      
  58.       while(hdeb.length < 4)
  59.       {
  60.        hdeb="0"+hdeb;
  61.       }
  62.    
  63.       var hfin=XML_Doc.getElementsByTagName('hfine').item(Index).firstChild.nodeValue.toString();
  64.       hfin=hfin.toString();
  65.       while(hfin.length < 4)
  66.       {
  67.        hfin="0"+hfin;
  68.       }
  69.    
  70.       hdeb=hdeb.substr(0, 2)+"h "+hdeb.substr(2,2);
  71.       hfin=hfin.substr(0, 2)+"h "+hfin.substr(2,2);
  72.    
  73.    
  74.        events += "<fieldset><span class=\"souligne\">De "+hdeb+" à "+hfin+"</span><br>"+XML_Doc.getElementsByTagName('nomce').item(Index).firstChild.nodeValue+" avec      "+XML_Doc.getElementsByTagName('educe').item(Index).firstChild.nodeValue+"<br><br>"+XML_Doc.getElementsByTagName('comme').item(Index).firstChild.nodeValue+"<br><br>"+boutons+"</fieldset>";
  75.        }
  76.      }
  77. }
  78. }
  79. Xhr_Object.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  80. var Arguments = 'annee='+annee+'&mois='+mois+'&jour='+jour;
  81. Xhr_Object.send(Arguments);
  82. }


(Je sais pas si mes copier/coller pour le forum sont bons, mais dans mon script il ne manque pas de parenthèses ou d'acolades.)
 
Ensuite, voici le XML renvoyé par mon req_calendrier.php
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <calendrier>
  3.    <Entrainements>
  4.       <CompteurEnt>1</CompteurEnt>
  5.       <hdebe>1800</hdebe>
  6.       <hfine>2000</hfine>
  7.       <comme>Entraînement des cadets</comme>
  8.       <ide>6</ide>
  9.       <educe>HIPIE Tiki</educe>
  10.       <nomce>Cadets</nomce>
  11.    </Entrainements>
  12. </calendrier>


 
Et enfin, le code PHP permettant de générer ce code xml

Code :
  1. header('Pragma: no-cache');
  2. header('Expires: 0');
  3. header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
  4. header('Cache-Control: no-cache, must-revalidate');
  5. header('Content-type: application/xml');
  6.  
  7. session_start();
  8. include("./connectdb2.php" );
  9. $Xml = new xmlWriter();
  10. $Xml->openMemory();
  11. $Xml->setIndentString('   ');
  12. $Xml->setIndent(true);
  13. $Xml->startDocument('1.0','UTF-8');
  14. $Xml->startElement ('calendrier');
  15. //les entrainements
  16. $chaine_req="
  17. REQUETE SQL QUI VA BIEN";
  18. $req_evt=mysql_query($chaine_req)or die(mysql_error());
  19. $Xml->startElement ('Entrainements');
  20. if (mysql_num_rows($req_evt)>0)
  21. {// Créer un objet xmlWriter qui écrit des balises xHTML
  22.      $Xml->startElement ('CompteurEnt');       $Xml->text  (mysql_num_rows($req_evt));                $Xml->endElement();
  23.      
  24.      while ($Sql_Ligne_M = mysql_fetch_array($req_evt))
  25.             {
  26.  if($Sql_Ligne_M['commentaire']=="" )
  27.  {
  28.   $comm="Aucun commentaire.";
  29.  }
  30.  else
  31.  {
  32.   $comm=html_entity_decode(html_entity_decode($Sql_Ligne_M['commentaire']));
  33.  }
  34.  $Xml->startElement ('hdebe');       $Xml->text  ($Sql_Ligne_M['heure_debut']);               $Xml->endElement();
  35.  $Xml->startElement ('hfine');       $Xml->text  ($Sql_Ligne_M['heure_fin']);             $Xml->endElement();
  36.  $Xml->startElement ('comme');       $Xml->text  ($comm);             $Xml->endElement();
  37.  $Xml->startElement ('ide');       $Xml->text  ($Sql_Ligne_M['id']);             $Xml->endElement();
  38.  $Xml->startElement ('educe');       $Xml->text  ($Sql_Ligne_M['nomed']." ".$Sql_Ligne_M['prenomed']);             $Xml->endElement();
  39.  $Xml->startElement ('nomce');       $Xml->text  ($Sql_Ligne_M['nomc']);             $Xml->endElement();
  40. }
  41.      
  42. }
  43. else
  44. {
  45. $Xml->startElement ('CompteurEnt');       $Xml->text  (0);                $Xml->endElement();
  46. }
  47. $Xml->endElement();
  48. $Xml->endElement();
  49.  
  50. print $Xml->outputMemory(true);
  51. Unset($_POST, $Sql_Ligne_M, $req_evt, $Xml);
  52.  
  53. mysql_close();


 
Problème :
Ce code me renvoie l'erreur :  
 
Uncauth TypeError: Cannot read property 'firstChild' of null
Xhr_Object.onreadystatechange
 
Voilà  [:petrus75]  
 
Merci à tous pour votre aide.


Message édité par brutax le 20-10-2013 à 10:58:45
Reply

Marsh Posté le 13-10-2013 à 14:22:15   

Reply

Marsh Posté le 13-10-2013 à 15:03:01    

C'est de l'Ajax.
 
Une lecture rapide montre une petite incohérence.

var hdeb=XML_Doc.getElementsByTagName('hdebe').item(Index).firstChild.nodeValue;
 var hfin=XML_Doc.getElementsByTagName('hfine').item(Index).firstChild.nodeValue.toString();

Pourquoi avoir ToString() pour le deuxième ? Ce n'est peut-être pas grave.
 
Le message d'erreur est clair : Uncauth TypeError: Cannot read property 'firstChild' of null
Le problème vient de ce qu'il est noté parent.firstChild quelque part avec un parent qui est nul.
 
L'ennui, c'est qu'il y a plusieurs lignes contenant firstChild, susceptibles de causer ce problème.
Il faudrait circonscrire le problème, par exemple en faisant des tests et en mettant des lignes en commentaires.
 
Edit :
Ce qui est étrange, c'est que XML_Doc est défini nulle part.
Il me semble qu'il manque :

XML_Doc =Xhr_Object.responseXML;
events ="";

Message cité 1 fois
Message édité par olivthill le 13-10-2013 à 15:24:57
Reply

Marsh Posté le 13-10-2013 à 15:42:25    

olivthill a écrit :

C'est de l'Ajax.

 

Une lecture rapide montre une petite incohérence.

var hdeb=XML_Doc.getElementsByTagName('hdebe').item(Index).firstChild.nodeValue;
 var hfin=XML_Doc.getElementsByTagName('hfine').item(Index).firstChild.nodeValue.toString();

Pourquoi avoir ToString() pour le deuxième ? Ce n'est peut-être pas grave.


Bien vu.
c'est une petite coquille, je l'ai corrigée mais le problème ne vient pas de là.

 
olivthill a écrit :


Le message d'erreur est clair : Uncauth TypeError: Cannot read property 'firstChild' of null
Le problème vient de ce qu'il est noté parent.firstChild quelque part avec un parent qui est nul.

 

L'ennui, c'est qu'il y a plusieurs lignes contenant firstChild, susceptibles de causer ce problème.
Il faudrait circonscrire le problème, par exemple en faisant des tests et en mettant des lignes en commentaires.


Des test de quel genre ?

 

est ce que je peux faire

Code :
  1. if(var id_evt=XML_Doc.getElementsByTagName('id').item(Index).firstChild.nodeValue;)
  2. {
  3.      alert("id_evt OK" );
  4. }


?

 
olivthill a écrit :


Edit :
Ce qui est étrange, c'est que XML_Doc est défini nulle part.
Il me semble qu'il manque :

XML_Doc =Xhr_Object.responseXML;
events ="";



Ah ? Je connais pas ça...
Faut le mettre où normalement ?

 

Merci pour ton aide :)


Message édité par brutax le 13-10-2013 à 16:04:33
Reply

Marsh Posté le 13-10-2013 à 22:44:15    

Je dirai après le :
 

Code :
  1. if(Xhr_Object.readyState == 4)
  2. {

Reply

Marsh Posté le 20-10-2013 à 10:38:47    

Salut !
Effectivement il manquait bien ce que tu m'as indiqué.
Malheureusement, ça ne résout pas mon problème non pus :'(

Reply

Marsh Posté le 20-10-2013 à 10:58:05    

AAAAaaaaahhhhhh !!!!!
J'ai trouvééééééééééééééééééé
 
Putain mais OMG quoi !!!!
 
Le problème venait de là :

Code :
  1. for (Index = 0; Index <= XML_Doc.getElementsByTagName('CompteurEnt').item(0).firstChild.nodeValue; Index++)


 
Fallait juste mettre "<" sinon je loop une fois de trop et ça plante  [:petrus75]  
 
Roohhh... Une semaine pour trouver ça  
 [:fegafobobos:2]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed