Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

AJAX [object Element] dans innerHTML

3 réponses
Avatar
DamBec
Bonjour à tous,
Je fais une petite appli en Ajax/PHP pour soumettre via un formulaire une
requête SQL et en afficher le résultat dans la page courante.

Dans le fichier de réponse XML j'ai donc inclus un tableau HTML que je
souhaite afficher dans ma page avec innerHTML

Le problème qui me rend fou c'est que dans le DIV de résultat s'affiche
uniquement le texte suivant :
[object Element] et non pas le tableau HTML.

Voici un extrait du code qui recherche dans la réponse XMl les tableaux pour
tenter de l'inclure dans la page courante.

reg['out_tab']=window.document.getElementById('tab');
var table = RepXml.getElementsByTagName('table');
reg['out_tab'].innerHTML= table[0];



Je ne comprend vraiment pas ou ça merdouille ! !
Merci pour votre sympathie
DamBEC

3 réponses

Avatar
YD
reg['out_tab']=window.document.getElementById('tab');
var table = RepXml.getElementsByTagName('table');
reg['out_tab'].innerHTML= table[0];

Je ne comprend vraiment pas ou ça merdouille ! !


A gauche : reg['out_tab'].innerHTML qui attend donc
une chaîne (à interpréter comme du HTML après)

A droite : table[0] un objet DOM (qui quand on demande
sa valeur en chaîne renvoie [object Element] ou un
équivalent selon le navigateur utilisé, comme tous les
objets DOM)

Solutions : Soit tu utilises appendChild pour ajouter
la table au DOM, soit tu utilises innerHTML des deux
côtés. Ma préférence va à la 1e des 2 propositions...

--
Y.D.

Avatar
dambec
reg['out_tab']=window.document.getElementById('tab');
var table = RepXml.getElementsByTagName('table');
reg['out_tab'].innerHTML= table[0];

Je ne comprend vraiment pas ou ça merdouille ! !


A gauche : reg['out_tab'].innerHTML qui attend donc
une chaîne (à interpréter comme du HTML après)

A droite : table[0] un objet DOM (qui quand on demande
sa valeur en chaîne renvoie [object Element] ou un
équivalent selon le navigateur utilisé, comme tous les
objets DOM)

Solutions : Soit tu utilises appendChild pour ajouter
la table au DOM, soit tu utilises innerHTML des deux
côtés. Ma préférence va à la 1e des 2 propositions...

Salut Merci,


J'ai tester avec les deux soluces :
1) avec append child
reg['out_tab'].appendChild(table[0]);

C bizare le DOM est bien envoyer vers le DIV mais le tableau
s'affiche comme un simple texte sans cellule



2) avec innerHTML ou inner text
reg['out_tab'].innerHTML=table[0].innerHTML;



içi cela indique [undefinned]

C vrai que ta premiere prop semble ultra génial mais pourquoi ce type
d'affichage ??


D'avance merci

DAMBEC


Avatar
SAM
reg['out_tab']=window.document.getElementById('tab');
var table = RepXml.getElementsByTagName('table');
reg['out_tab'].innerHTML= table[0];

Je ne comprend vraiment pas ou ça merdouille ! !


A gauche : reg['out_tab'].innerHTML qui attend donc
une chaîne (à interpréter comme du HTML après)

A droite : table[0] un objet DOM (qui quand on demande
sa valeur en chaîne renvoie [object Element] ou un
équivalent selon le navigateur utilisé, comme tous les
objets DOM)

Solutions : Soit tu utilises appendChild pour ajouter
la table au DOM, soit tu utilises innerHTML des deux
côtés. Ma préférence va à la 1e des 2 propositions...

Salut Merci,


J'ai tester avec les deux soluces :
1) avec append child
reg['out_tab'].appendChild(table[0]);

C bizare le DOM est bien envoyer vers le DIV mais le tableau
s'affiche comme un simple texte sans cellule



2) avec innerHTML ou inner text
reg['out_tab'].innerHTML=table[0].innerHTML;



içi cela indique [undefinned]

C vrai que ta premiere prop semble ultra génial mais pourquoi ce type
d'affichage ??


Je comprends pas ...

déjà : reg['out_tab'] qu'est-ce que ça peut bien être ?

D'autre part si tu veux extraire une partie HTML (ou DOM) d'une réponse
ajax, perso je ferais d'abord afficher ce résultat (dans un div caché?)
puis en extrairait le table pour aller l'appendChilder là où je le veux.

Chercher à décortiquer à la volée une chaine de caractères en se fiant
au DOM n'a aucun sens (à mon idée,hein ?).


Donc essayer qque chose comme ('temp' est un div caché):

var D = document.getElementById('temp');
D.innerHTML = xhlr.responseText;
var T = D.getElementsByTagName('TABLE')[0];
document.getElementById('tab').appendChild(T);
D = null;


Maintenant si 'tab' est déjà un table, ce n'est pas le même cinoche

var D = document.createElement('DIV');
D.innerHTML = xhlr.responseText;
var T = D.getElementsByTagName('TR');
var cible = document.getElementById('tab');
cible = cible.getElementsByTagName('TBODY')[0];;
for(var i=0; i<T.length; i++)
cible.innerHTML += (T[i]).innerHTML;
D = null;

ou :

var D = document.createElement('DIV');
D.innerHTML = xhlr.responseText;
var T = D.getElementsByTagName('TABLE')[0];
var cible = document.getElementById('tab')
cible.parentNode.replaceChild(T, cible);
D = null;

--
sm