[JS DOM]Tableau créé en DOM, s'affiche sous FF, pas sous IE

Tableau créé en DOM, s'affiche sous FF, pas sous IE [JS DOM] - HTML/CSS - Programmation

Marsh Posté le 08-04-2007 à 12:12:21    

Bonjour tout le monde. Je fais appel pour la première fois à vos lumières car cette fois-ci, je ne trouve pas du tout la solution dans les multiples participations de ce forum.  
 
L'object de mon problème :  
J'ai voulu me mettre au DOM en créant un tableau, car innerHTML est assez lourd à manipuler dans ce cas là, même si ça marche (j'ai essayé).  
 
Voici le code :  
 

Code :
  1. //Créer l'objet objTabExif
  2. objTabExif = document.createElement("table" );
  3. objTabExif.setAttribute("id","tabExif" );
  4. //création des lignes et ajout au tableau
  5. //marque
  6. trExif = new CreateTrExif("Marque de l'appareil", marque.item(num).firstChild.nodeValue);//au lieu de data
  7. objTabExif.appendChild(trExif);
  8. //modele
  9. trExif = new CreateTrExif("Modèle", modele.item(num).firstChild.data);
  10. objTabExif.appendChild(trExif);
  11. //focale
  12. trExif = new CreateTrExif("Focale utilisée", focReelle.item(num).firstChild.data+" mm" );
  13. objTabExif.appendChild(trExif);
  14. //foc equi
  15. trExif = new CreateTrExif("équivalent en 35 mm à ", focEquiv.item(num).firstChild.data+" mm" );
  16. objTabExif.appendChild(trExif);
  17. //ouverture
  18. trExif = new CreateTrExif("Ouverture", ouverture.item(num).firstChild.data);
  19. objTabExif.appendChild(trExif);
  20. //temsp de pose
  21. trExif = new CreateTrExif("Temps de pose", tempsPose.item(num).firstChild.data+" s" );
  22. objTabExif.appendChild(trExif);
  23. //iso
  24. trExif = new CreateTrExif("sensibilité", iso.item(num).firstChild.data+" ISO" );
  25. objTabExif.appendChild(trExif);
  26. //programme
  27. trExif = new CreateTrExif("Programme", programme.item(num).firstChild.data);
  28. objTabExif.appendChild(trExif);
  29. //corr expo
  30. trExif = new CreateTrExif("Correction d'exposition", corrExpo.item(num).firstChild.data+" ev" );
  31. objTabExif.appendChild(trExif);
  32. //date pdv
  33. trExif = new CreateTrExif("Photo prise le", datePdv.item(num).firstChild.data);
  34. objTabExif.appendChild(trExif);
  35. //date bdd
  36. trExif = new CreateTrExif("Sur le site depuis le", dateBdd.item(num).firstChild.data);
  37. objTabExif.appendChild(trExif);
  38. //enfin : ajout du tableau au calque ou remplacement de l'ancien tableau
  39. if(document.getElementById("exif" ).hasChildNodes()){
  40.  ancTabExif = document.getElementById("exif" ).firstChild;
  41.  document.getElementById("exif" ).replaceChild(objTabExif, ancTabExif);
  42.  }
  43. else{
  44.  document.getElementById("exif" ).appendChild(objTabExif);
  45.  }


Et voici la fonction CreateTrExif :  

Code :
  1. function CreateTrExif(txtItem, txtData)//crée une ligne à deux colonnes (gauche, id="itmeExif" ; dr, id="dataExif" )
  2. {
  3. var trExif = document.createElement("tr" );
  4. var itemExif = document.createElement("td" );
  5. itemExif.setAttribute("class","itemExif" );
  6. var item = document.createTextNode(txtItem);
  7. itemExif.appendChild(item);
  8. trExif.appendChild(itemExif);
  9. var dataExif = document.createElement("td" );
  10. dataExif.setAttribute("class","dataExif" );
  11. var data = document.createTextNode(txtData);
  12. dataExif.appendChild(data);
  13. trExif.appendChild(dataExif);
  14. return trExif;
  15. }


 
 
Mon problème : le tableau s'affiche correctement sous FF, exactement comme je veux.  
Sous IE, rien, blanc, nada.  
 
Bien sûr, ça fait deux jours que je cherche ce qui chatouille Bill Gates : par exemple, les "alert" m'affiche bien le contenu de chaque case dans IE. Donc le programme fonctionne, pas d'erreur de code (je dis cela avec prudence vu que j'ai deux mois d'expérience).  
 
Le seul pb semble l'affichage à l'écran. Et là, je sèche...
 
Quelqu'un a-t-il un début de solution ? Merci d'avance.

Reply

Marsh Posté le 08-04-2007 à 12:12:21   

Reply

Marsh Posté le 10-04-2007 à 09:37:36    

Petit up du début de semaine... :hello:

Reply

Marsh Posté le 10-04-2007 à 10:04:05    

Après ton append/replace de objTabExif rajoute juste la ligne suivante:

Code :
  1. document.getElementById("exif" ).innerHTML += '';


Parfois IE ne rafraichit pas l'affichage de la page lors de manipulations DOMs, la ligne dessus "force" ce rafraichissement.

Reply

Marsh Posté le 10-04-2007 à 10:30:01    

Sur IE, il faut ajouter un element TBODY contenant chaque TR

Reply

Marsh Posté le 10-04-2007 à 10:48:27    

nonau57 a écrit :

Sur IE, il faut ajouter un element TBODY contenant chaque TR


:??:

Reply

Marsh Posté le 10-04-2007 à 10:49:23    

nonau57 a écrit :

Sur IE, il faut ajouter un element TBODY contenant chaque TR


il faut pas plutot ajouter 1 element tbody contenant tous les TR ?

 

sémantiquement ca me parait plus juste

 

et innerhtml ne fonctionne pas dans un tableua sous IE

Message cité 3 fois
Message édité par flo850 le 10-04-2007 à 10:49:53
Reply

Marsh Posté le 10-04-2007 à 10:54:45    

flo850 a écrit :

et innerhtml ne fonctionne pas dans un tableua sous IE


tombe bien c'est sur le div conteneur que je disais de le faire [:dawak]
Démo pour arrêter les digressions:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8. function CreateTrExif(txtItem, txtData)//crée une ligne à deux colonnes (gauche, id="itmeExif" ; dr, id="dataExif" )
  9. {
  10.   var trExif = document.createElement("tr" );
  11.   var itemExif = document.createElement("td" );
  12.   itemExif.setAttribute("class","itemExif" );
  13.   var item = document.createTextNode(txtItem);
  14.   itemExif.appendChild(item);
  15.   trExif.appendChild(itemExif);
  16.   var dataExif = document.createElement("td" );
  17.   dataExif.setAttribute("class","dataExif" );
  18.   var data = document.createTextNode(txtData);
  19.   dataExif.appendChild(data);
  20.   trExif.appendChild(dataExif);
  21.   return trExif;
  22. }
  23. window.onload = function () {
  24.   objTabExif = document.createElement("table" );
  25.   objTabExif.setAttribute("id","tabExif" );
  26.   //création des lignes et ajout au tableau
  27.   //marque
  28.   trExif = new CreateTrExif("Marque de l'appareil", "toto" );//au lieu de data
  29.   objTabExif.appendChild(trExif);
  30.   //modele
  31.   trExif = new CreateTrExif("Modèle","tata" );
  32.   objTabExif.appendChild(trExif);
  33.   //focale
  34.   trExif = new CreateTrExif("Focale utilisée", "titi" );
  35.   objTabExif.appendChild(trExif);
  36.   //foc equi
  37.   trExif = new CreateTrExif("équivalent en 35 mm à ", "tutu" );
  38.   objTabExif.appendChild(trExif);
  39.   //ouverture
  40.   trExif = new CreateTrExif("Ouverture", "tyty" );
  41.   objTabExif.appendChild(trExif);
  42.   //temsp de pose
  43.   trExif = new CreateTrExif("Temps de pose", "tete" );
  44.   objTabExif.appendChild(trExif);
  45.   //iso
  46.   trExif = new CreateTrExif("sensibilité", "zozo" );
  47.   objTabExif.appendChild(trExif);
  48.   //programme
  49.   trExif = new CreateTrExif("Programme", "zizi" );
  50.   objTabExif.appendChild(trExif);
  51.   //corr expo
  52.   trExif = new CreateTrExif("Correction d'exposition", "zuzu" );
  53.   objTabExif.appendChild(trExif);
  54.   //date pdv
  55.   trExif = new CreateTrExif("Photo prise le", "zaza" );
  56.   objTabExif.appendChild(trExif);
  57.   //date bdd
  58.   trExif = new CreateTrExif("Sur le site depuis le","zezez" );
  59.   objTabExif.appendChild(trExif);
  60.   //enfin : ajout du tableau au calque ou remplacement de l'ancien tableau
  61.   if(document.getElementById("exif" ).hasChildNodes()){
  62.     ancTabExif = document.getElementById("exif" ).firstChild;
  63.     document.getElementById("exif" ).replaceChild(objTabExif, ancTabExif);
  64.   } else{
  65.     document.getElementById("exif" ).appendChild(objTabExif);
  66.   }
  67.   document.getElementById("exif" ).innerHTML += '';
  68. }
  69.   </script>
  70. </head>
  71. <body>
  72. <div id="exif"></div>
  73. </body>
  74. </html>


 
 

Reply

Marsh Posté le 10-04-2007 à 13:47:47    

flo850 a écrit :

il faut pas plutot ajouter 1 element tbody contenant tous les TR ?

 

sémantiquement ca me parait plus juste

 

et innerhtml ne fonctionne pas dans un tableua sous IE


S'toutafé ça

 

Si je suis pas trop fatigué :

Code :
  1. <table>
  2. <summary></summuray>
  3. <thead>
  4.  <tr>
  5.   <th></th>
  6.  </tr>
  7. </thead>
  8. <tbody>
  9.  <tr>
  10.   <td></td>
  11.  </tr>
  12. </tbody>
  13. </table>


Message édité par Shinuza le 10-04-2007 à 13:48:04

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 14:07:14    

anapajari > je repondais a totau  
et sinon, une question con : pourquoi tu fasi un new devant un appel de fonction ? ( en l'occurence createTrExif()  
 
shinuza > pour en rajouter une couche  tu peux avoir autant de tbody que voulu
et tu as aussi un element tfoot  qui est utile. Par contre je suis pas sur que IE gere tout bien

Reply

Marsh Posté le 10-04-2007 à 14:22:45    

flo850 a écrit :

anapajari > je repondais a totau  
et sinon, une question con : pourquoi tu fasi un new devant un appel de fonction ? ( en l'occurence createTrExif()  


s'pas moi c'est serman qu'a commencé :o
En fait en js permet aussi de déclarer des "classes". A ce moment là, l'appel se fait avec new.
Moi j'ai juste repris  le code posté plus haut, il s'en servait ainsi.
 
Maintenant c'est vrai qu'une classe nommée CreateTrExif c'est du grand nawak, d'autant qu'il ne se sert jamais du this ( qui devrait être l'objet retourné par sa méthode). [:spamafote]

Reply

Marsh Posté le 10-04-2007 à 14:22:45   

Reply

Marsh Posté le 10-04-2007 à 17:30:54    

Je viens d'essayer le truc d'anapajari et ça marche parfaitement.  
 
Respect messieur  :jap:  :jap:  :jap:  
 
Je ne l'aurais jamais inventé !

Reply

Marsh Posté le 10-04-2007 à 17:44:05    

anapajari a écrit :

s'pas moi c'est serman qu'a commencé :o
En fait en js permet aussi de déclarer des "classes". A ce moment là, l'appel se fait avec new.
Moi j'ai juste repris  le code posté plus haut, il s'en servait ainsi.
 
Maintenant c'est vrai qu'une classe nommée CreateTrExif c'est du grand nawak, d'autant qu'il ne se sert jamais du this ( qui devrait être l'objet retourné par sa méthode). [:spamafote]


 
Le grand nawak vient certainement du fait que c'est ma première création DOM et mon ancienneté dans la conception de site remonte au 2 février 2007. Quand ça s'est affiché sous FF, j'ai été le premier surpris d'avec réussi en 30 mn !
Là où je te suis, c'est que j'ai effectivement cherché à utiliser le fameux "this" (pour faire comme il dit dans mon bouquin : un "constructeur" et il utilisait bien un "new", d'où ma déclaration) mais j'ai foiré et donc j'ai abandonné...pour le moment, hein !  
 
Si quelqu'un peut m'expliquer comment il faut faire (ou m'indiquer une référence accessible sur le sujet), je suis preneur !
 
Si mon "new" ne sert à rien, merci pour l'info et je le vire.  
 
L'intérêt que je trouve dans cette méthode, c'est que chaque ligne est ajoutée de façon claire, facile à modifier et peu importe l'ordre. Ensuite, chaque nom de classe est indiqué qu'une seule fois, ce qui simplifie à mon avis les maintenances futures.  
Mais bon, encore une fois, je débute et le DOM n'est pas ce que j'ai trouvé de plus facile pour démarrer.

Reply

Marsh Posté le 10-04-2007 à 17:47:31    

Au fait merci des participations des autres. Pour l'histoire du tbody, le navigateur semble s'en foutre donc j'ai pas essayé. Ceci dit, pour moi, il me semble que tbody n'a d'utilité que si il y a un thead ou un tfoot. Sinon, on s'en fout, non ?

Reply

Marsh Posté le 10-04-2007 à 18:02:26    

flo850 a écrit :

il faut pas plutot ajouter 1 element tbody contenant tous les TR ?
 
sémantiquement ca me parait plus juste  
 
et innerhtml ne fonctionne pas dans un tableua sous IE


Faux ! Désolé, mais c'est la solution lourdingue que j'ai employé en attendant le messie anapajari et ça marche, aussi bien sous FF que IE :  
 

Code :
  1. document.getElementById("exif" ).innerHTML = "<table id=\"tabExif\"><tr><td class=\"itemExif\">Marque de l'appareil</td><td class=\"dataExif\">"+marque.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Modèle</td><td class=\"dataExif\">"+modele.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Focale utilisée</td><td class=\"dataExif\">"+focReelle.item(num).firstChild.data+" mm</td></tr><tr><td class=\"itemExif\">équivalant en 35 mm</td><td class=\"dataExif\">"+focEquiv.item(num).firstChild.data+" mm</td></tr><tr><td class=\"itemExif\">Ouverture</td><td class=\"dataExif\">"+ouverture.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Temps de pose</td><td class=\"dataExif\">"+tempsPose.item(num).firstChild.data+" s</td></tr><tr><td class=\"itemExif\">ISO</td><td class=\"dataExif\">"+iso.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Programme</td><td class=\"dataExif\">"+programme.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Correction d'exposition</td><td class=\"dataExif\">"+corrExpo.item(num).firstChild.data+" ev</td></tr><tr><td class=\"itemExif\">Date</td><td class=\"dataExif\">"+datePdv.item(num).firstChild.data+"</td></tr><tr><td class=\"itemExif\">Entrée sur le site le</td><td class=\"dataExif\">"+dateBdd.item(num).firstChild.data+"</td></tr></table>" ;


 
D'ailleurs et dans ce cas, on ne peut même pas couper les lignes en utilisant :  
document.getElementById("exif" ).innerHTML += et ligne suivante, il faut écrire tout d'un seul tenant (lourdingue, je vous dis).  
 
C'est d'abord pour cela que je me suis mis au DOM dans un premier temps.

Reply

Marsh Posté le 10-04-2007 à 19:08:02    

j'ai bien dis , dans un tableau
 
la tu remplace le contenu d'un div  
 
essaye de modifier document.getElementById("tabExif" ).innerHTML  ou de modifier un tr en particulier  
 
sinon tu fais  
var contenu ='';
contenu +='premiere ligne';
contenu +='deuxieme ligne';
 
ca améliore la lisibilité

Reply

Marsh Posté le 10-04-2007 à 21:29:24    

flo850 a écrit :

j'ai bien dis , dans un tableau
 
la tu remplace le contenu d'un div  
 
essaye de modifier document.getElementById("tabExif" ).innerHTML  ou de modifier un tr en particulier  
 
sinon tu fais  
var contenu ='';
contenu +='premiere ligne';
contenu +='deuxieme ligne';
 
ca améliore la lisibilité


Ah OK j'avais pô compris.  :D  
 
Pour la solution que tu préconises, il me semble avoir essayé dans un premier temps, mais sans succés, c'est pour ça que je suis passé au DOM (d'ailleurs, je trouve que c'est plus élégant, question d'habitude).

Reply

Marsh Posté le 10-04-2007 à 22:10:56    

le dom est un peu plus elegant ( carrement plus )  , mais a des limites:
il est un peu plus lent a générer
tu ne peux pas générer des input

Reply

Marsh Posté le 10-04-2007 à 22:15:24    

Ca dépend combien d'élements tu emboites/ajoutes, mais certaines fois il vaut mieux utiliser innerHTML.
Pour ma part je n'ai jamais généré assez d'éléments pour visualiser une quelconque lenteur.

 

Edit : French for dummies ça existe?


Message édité par Shinuza le 10-04-2007 à 22:26:06

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 10-04-2007 à 22:22:43    

en ce moment, je "joue" avec un tableau qui a 20 colonnes, 5 000 lignes  
je n'en affiche que 25 ( soit quand meme 500 cases, chacune contenant  du gras, des liens, de l'italique , ....  ), avec des fleches de défilements, et un slider pour permettre de naviguer au sein du tableau  
 
les données sont instanciées a la demande ( xml httprequest dans tous les coins )  
 
le système est un peu plus réactif avec innerHTML qu'avec dom

Reply

Marsh Posté le 10-04-2007 à 23:09:36    

flo850 a écrit :

en ce moment, je "joue" avec un tableau qui a 20 colonnes, 5 000 lignes  
je n'en affiche que 25 ( soit quand meme 500 cases, chacune contenant  du gras, des liens, de l'italique , ....  ), avec des fleches de défilements, et un slider pour permettre de naviguer au sein du tableau  
 
les données sont instanciées a la demande ( xml httprequest dans tous les coins )  
 
le système est un peu plus réactif avec innerHTML qu'avec dom


Pour ajouter un input, que penses-tu de repérer la case avec un id généré en DOM (en utilisant setAttribute) et ensuite appliquer un innerHTML à cette case ?

Reply

Marsh Posté le 11-04-2007 à 09:17:12    

ca devriat marcher  
mais par habitude, j'evite de melanger dom /innerHTML  
 
ce que je veux dire , c'est qu'il n'y a pas de solutions miracle , donc il faut etre conscient des limitations de ces deux methodes

Reply

Marsh Posté le 11-04-2007 à 09:24:19    

flo850 a écrit :

en ce moment, je "joue" avec un tableau qui a 20 colonnes, 5 000 lignes  
je n'en affiche que 25 ( soit quand meme 500 cases, chacune contenant  du gras, des liens, de l'italique , ....  ), avec des fleches de défilements, et un slider pour permettre de naviguer au sein du tableau  
les données sont instanciées a la demande ( xml httprequest dans tous les coins )  
le système est un peu plus réactif avec innerHTML qu'avec dom


un peu plus réactif comme dans "ça fout l'ordi totalement à la ramasse quelle que soit la méthode?" :o
J'ai jamais fait aussi gros ( d'ailleurs je vois pas l'interet), mais j'avais fait 10 colonnes/500 lignes regroupées par bloc de 25 lignes ( résultat d'une recherche, groupé par page).
Et bin après de nombreux tests, le plus rapide était de générer tout le tableau dès le départ, de faire 20 tbody de 25 lignes et de joueur uniquement sur le display de ceux-ci.
 

serman a écrit :

Pour ajouter un input, que penses-tu de repérer la case avec un id généré en DOM (en utilisant setAttribute) et ensuite appliquer un innerHTML à cette case ?


Perso, j'ai tendance à le faire full dom je trouve ça plus aisé pour gérer les events. Mais Master Masklinn lui préfère innerHTML. C'est une question de gout... [:spamafote]

Reply

Marsh Posté le 11-04-2007 à 09:32:17    

anapajari a écrit :

un peu plus réactif comme dans "ça fout l'ordi totalement à la ramasse quelle que soit la méthode?" :o
J'ai jamais fait aussi gros ( d'ailleurs je vois pas l'interet), mais j'avais fait 10 colonnes/500 lignes regroupées par bloc de 25 lignes ( résultat d'une recherche, groupé par page).
Et bin après de nombreux tests, le plus rapide était de générer tout le tableau dès le départ, de faire 20 tbody de 25 lignes et de joueur uniquement sur le display de ceux-ci.


j'ai le choix de la méthode à utiliser, mais pas celui de l'appli a réaliser :/
le but est de réaliser en full web l'équivalent d'un client lourd :cry: : un annuaire avec un fonctionnement comme itunes : a mesure que tu tape, ca reduit le tableau des resultats + possibilité d'utiliser un slider et des tris  
 
en ojouant avec de la lazy instantiation , des requetes XML asynchrones j'arrive a rester dans des temps de reponses corrects ( moins d'une seconde dans le pire des cas ) et le passge dom=> innerhtml m'a fait gagner un petit peu de temps , mais a rendu le code moins lisible  

anapajari a écrit :


Perso, j'ai tendance à le faire full dom je trouve ça plus aisé pour gérer les events. Mais Master Masklinn lui préfère innerHTML. C'est une question de gout... [:spamafote]


perso ca depend :  
jouer avec la mise en page la structure de la page => dom
gros volume de texte a changer => innerhtml
 
plus les situations où on a pas trop le choix ( ajout d'un input => innerhtml , modification d'une ligne d'un tableau => dom )

Reply

Marsh Posté le 11-04-2007 à 09:37:21    

flo850 a écrit :


perso ca depend :  
jouer avec la mise en page la structure de la page => dom
gros volume de texte a changer => innerhtml


/me agrees
 

flo850 a écrit :

plus les situations où on a pas trop le choix ( ajout d'un input => innerhtml , modification d'une ligne d'un tableau => dom )


Je comprends pas ce mythe de l'ajout d'un input ne peut se faire que via innerHTML!!!
1- ça marche très bien en DOM ( tous navigateurs, même pour l'id et toussa)
2- je trouve ça bien plus pratique pour ajouter des events ( comme je le disais juste avant)

Reply

Marsh Posté le 11-04-2007 à 11:09:33    

tests perso :

 

version dom :

Code :
  1. td = document.createElement('td');
  2. input = document.createElement("input" );
  3. input.type="radio";
  4. input.name='t_action_'+ligne_courante;
  5. input.value='membre';
  6. input.checked = true;
  7. td.appendChild(input);
  8. tr.appendChild(td);
 

version innerHTML +dom : (parceque innerhtml seul ne fonctionne pas sur un tr, table , tbody )

Code :
  1. td = document.createElement('td');
  2. td.innerHTML = '<input type="radio" name="t_action_'+ligne_courante+'" value="membre" checked>';
  3. tr.appendChild(td);
 

la version innerHTML fonctionne sous IE , l'autre fait bien apparaitre les inputs, mais ils ne sont pas cliquables

 


Message édité par flo850 le 11-04-2007 à 11:11:09
Reply

Marsh Posté le 11-04-2007 à 11:59:59    

j'aurais du me douter que tu allais me sortir l'exemple du radio qui effectivement ne marche pas  "directement".
Tu noteras tout de même que via une redéfinition de l'event onclick, il n'y a plus de probleme:

Code :
  1. input.onclick = function (){
  2.       this.checked = ! this.checked;
  3.     }

Reply

Marsh Posté le 11-04-2007 à 15:30:50    

pas fait expres, c'est un pb sur lequel je me suis pris la tete en fin de semaine derniere
je n'ai meme aps penser a utiliser le onclick , tellement j'etais persuadé que ca n'allais pas fonctionner
:jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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