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

Mootools: modifier la réponse

37 réponses
Avatar
Tr
Bonsoir,

j'utilise mootools pour exécuter une requête xmlhttp asynchrone.
dans le onsucces, je récupère le résultat de cette requête.
je souhaite modifier ce résultat:

la requête appelle un script php qui fait des choses puis calcule le
temps qu'il a mis pour le faire, tout ça construit un bout de page qui
est ensuite envoyé comme réponse, du classique.

pour le moment, lorsque j'affiche le résultat dans la page finale, le
temps d'exécution s'affiche en bas de page, c'est la dernière opération
faite par le script php.

je veux que ce résultat s'affiche en haut de la page (donc en premier
dans la réponse)

je pensais récupérer dans la réponse de la requête, avant de l'afficher
dans la page finale, le contenu du div qui affiche le temps d'exécution
en bas, et le copier dans un div en haut de la page.

malheureusement, et c'est pas faute d'avoir cherché, je ne trouve pas
comment accéder aux éléments de la réponse de la requête.

pourtant, je suis sûr qu'il existe une méthode simple et élégante pour
faire ça...
peut-être que je m'y prends très mal...
j'espère que quelqu'un pourra m'aiguiller :-)

par avance merci!

--
On est ce qu'on fait, pas ce qu'on dit ni pense être. (Réflexion)
tranquille.xav@gmail.com

10 réponses

1 2 3 4
Avatar
SAM
Le 06/03/12 22:40, a écrit :
*Ecrit* *par* *SAM*:





à mon idée ce "responseTree" doit être un fragment XML







j'ai essayé ça:
alert(responseTree.item(1));
et j'ai ça:
[object HTMLDivElement]
ça avance je trouve :-)
idées prises ici:
<http://groups.google.com/group/mootools-users/browse_thread/thread/22a0975516acd747>





et avec alert(responseTree.item(1).value); ou .text j'ai undefined
c'est cette partie qui me manque, comment naviguer, chercher et
modifier là-dedans...





bon, alors si ça marchicote, on avance, on avance ;-)

var d = responseTree.$$('*'), // tous les tags dans le XML de retour
n = d.length, // le nbre de ces tags ou balises
t = ''; // une chaine (vide pour le moment)

while(n--) t += d[n].innerHTML +'<br>n'; // on remplit la chaine avec
// le contenu entre balises

document.write(t);
// ou
alert(t);


Si on préfère légèrement plus propre :
while(n--)
t += d.item(n).innerHTML +'<br>n';


avec ça:
alert(responseTree.item(1).get('text'));
j'obtiens enfin le contenu du div, yes!
malheureusement, si je mets 2 à la place de 1 j'ai
Uncaught exception: TypeError: 'responseTree.item(2).get' is not a function



parce que l'item(2) n'existe sans doute pas

il faudrait faire :
if(responseTree.item(2)) alert(responseTree.item(2).get('text'));
else alert('pas d'item 2');
ou :
if(responseTree.item(2)) alert(responseTree.item(2).innerHTML);

j'ai essayé avec
alert(responseTree.getElementsByTagName('TempsExec'));
(nom du div)



si 'TempsExec' est l'id du div recherché, ce serait :

if(responseTree.getElementById('TempsExec'))
alert(responseTree.getElementById('TempsExec').innerHTML);

j'ai
Uncaught exception: TypeError: 'responseTree.getElementsByTagName' is
not a function



ben ... oui 'TempsExec' n'est certainement pas un tag (une balise)
(pas un 'P', un 'DIV', un 'H1' ou même un 'A')

voilà, je ne sais pas trop ce que je récupère du coup...




On voit bien que tu t'entraines à la brasse coulée ;-)


--
Stéphane Moriaux avec/with iMac-intel
Avatar
SAM
Le 06/03/12 22:40, a écrit :
idées prises ici:
<http://groups.google.com/group/mootools-users/browse_thread/thread/22a0975516acd747>








moi, j'ai trouvé ça :
<http://stackoverflow.com/questions/1843995/>

new Request({
url: '/your-rss-parser.php',
method: 'get',
onSuccess: function(responseText, responseXML) {
responseXML.getElements('item').each(function(item) {
alert(item.getElement('title').get('text'));
});
}
}).send();


bien entendu dans cet exemple il faut qu'il y ait :
- un fichier '/your-rss-parser.php' qui crée du xml
- et qui contienne des balises XML 'title'

et avec alert(responseTree.item(1).value); ou .text j'ai undefined
c'est cette partie qui me manque, comment naviguer, chercher et
modifier là-dedans...





responseTree.item(1) est le contenant de tout le reste
(exemple : balise html)

il faut ensuite chercher dans ce contenant le div voulu

mais ... si le div cherché a un ID, le + simple devrait être :

if(responseTree.getElementById('truc')) {
alert('balise = '+responseTree.getElementById('truc').tagName);
alert('contenu = '+responseTree.getElementById('truc').innerHTML);
document.body.insertBefore(responseTree.getElementById('truc'),
document.body.firstChild); // le div 'truc' en début de page
}


Manipulation des elements en JavaScript non Mootools, normal quoi :
<http://fr.selfhtml.org/javascript/objets/node.htm>

Peut-être il y a t-il une instruction Mootools pour 'getElementById' ??
va savoir ?!

Mais si tu tiens à utiliser Mootools, une petite formation serait sans
doute utile ?
Mootools en 30 jours :
<http://www.6ma.fr/tuto/mootools+jours+jour+1+introduction-458>

--
Stéphane Moriaux avec/with iMac-intel
Avatar
Tr
*Ecrit* *par* *SAM*:
Le 06/03/12 22:40, a écrit :
idées prises ici:
<http://groups.google.com/group/mootools-users/browse_thread/thread/22a0975516acd747>








moi, j'ai trouvé ça :
<http://stackoverflow.com/questions/1843995/>

new Request({
url: '/your-rss-parser.php',
method: 'get',
onSuccess: function(responseText, responseXML) {
responseXML.getElements('item').each(function(item)
{
alert(item.getElement('title').get('text'));
});
}
}).send();


bien entendu dans cet exemple il faut qu'il y ait :
- un fichier '/your-rss-parser.php' qui crée du xml
- et qui contienne des balises XML 'title'



oui, j'avais essayé aussi, ça fait plusieurs jours que je cherche :-)

et avec alert(responseTree.item(1).value); ou .text j'ai undefined
c'est cette partie qui me manque, comment naviguer, chercher et
modifier là-dedans...





responseTree.item(1) est le contenant de tout le reste
(exemple : balise html)

il faut ensuite chercher dans ce contenant le div voulu

mais ... si le div cherché a un ID, le + simple devrait être :

if(responseTree.getElementById('truc')) {
alert('balise = '+responseTree.getElementById('truc').tagName);
alert('contenu = '+responseTree.getElementById('truc').innerHTML);
document.body.insertBefore(responseTree.getElementById('truc'),
document.body.firstChild); // le div 'truc' en début de page
}


Manipulation des elements en JavaScript non Mootools, normal quoi :
<http://fr.selfhtml.org/javascript/objets/node.htm>

Peut-être il y a t-il une instruction Mootools pour 'getElementById'
?? va savoir ?!

Mais si tu tiens à utiliser Mootools, une petite formation serait
sans doute utile ?
Mootools en 30 jours :
<http://www.6ma.fr/tuto/mootools+jours+jour+1+introduction-458>



ok, j'ai mis tout mon ensemble de code dans un zip:
<http://www.tranquille-informatique.fr/perso/tempo/verif-logs.7z>
si tu as du temps, décompresse le tout dans un dossier puis lance la
page testlog.php...
le problème, c'est que le document en fin de requete ne contient pas le
résultat de la requête, et que le contenu de la requête ne permet pas
d'utiliser les fonctions de base genre getelementbyid...

je te laisse regarder le code, notamment, le js, si tu as du temps...

par avance merci!

--
S'inquiéter pour les problèmes à venir, c'est les vivre deux fois. (Pas
de moi)

Avatar
Kalowycz
Le 07/03/2012 19:35, a écrit :

ok, j'ai mis tout mon ensemble de code dans un zip:
<http://www.tranquille-informatique.fr/perso/tempo/verif-logs.7z>
si tu as du temps, décompresse le tout dans un dossier puis lance la
page testlog.php...



Salut,

J'avais un peu de temps en voyant ta réponse, alors j'ai jeté un coup
d'oeil, désolé pour SAM si je le court-circuite sur ce coup-là. ;-)

A mon avis, tu galère pour rien au niveau de JS, bien qu'il soit
possible d'y arriver par ce biais.

Si tu utilise la temporisation de sortie (output buffering) sous PHP, tu
peux intervertir sans problème tes flux de sortie.

Je t'ai collé le code modifié de "test.php" sur ce lien temporaire :
http://pastebin.com/zv4MbyRD

J'en ai profité pour cross-poster sur f.c.l.php, vu qu'on change de
problématique langagière !

Cdlt,
Kal
Avatar
Tr
*Ecrit* *par* *Kalowycz*:
Le 07/03/2012 19:35, a écrit :

ok, j'ai mis tout mon ensemble de code dans un zip:
<http://www.tranquille-informatique.fr/perso/tempo/verif-logs.7z>
si tu as du temps, décompresse le tout dans un dossier puis lance
la
page testlog.php...



Salut,

J'avais un peu de temps en voyant ta réponse, alors j'ai jeté un coup
d'oeil, désolé pour SAM si je le court-circuite sur ce coup-là. ;-)

A mon avis, tu galère pour rien au niveau de JS, bien qu'il soit
possible d'y arriver par ce biais.

Si tu utilise la temporisation de sortie (output buffering) sous PHP,
tu peux intervertir sans problème tes flux de sortie.

Je t'ai collé le code modifié de "test.php" sur ce lien temporaire :
http://pastebin.com/zv4MbyRD

J'en ai profité pour cross-poster sur f.c.l.php, vu qu'on change de
problématique langagière !

Cdlt,
Kal



super, j'essayais au départ d'imaginer comment on pouvait renvoyer la
fin d'une page php au début en php, mais j'ai cru que ça n'était pas
possible, et bien ça l'est !!!

j'ai regardé vite fait le code, ce soir je n'ai pas le temps de
l'essayer.
si je comprends bien, j'enclenche la temporisation d'affichage, ensuite
je mets dans une variable le contenu de ma future page, puis je
nettoie, je mets la suite dans une autre, je nettoie, j'affiche en
inversant... la temporisation s'arrête toute seule en fin de script? il
n'y a pas de ob_stop?
(je viens de regarder l'aide d'ob_start et il y a des fonctions pour
arrêter: ob_end_flush(); faut-il en mettre une ou est-ce inutile?

merci beaucoup...

par curiosité, j'aimerais quand-même savoir pourquoi en js ça n'y va
pas:
- comment faire pour accéder à la response et la modifier avant de
l'afficher
- et/ou, comment faire pour "rafraichir" la page sans la recharger afin
que le dom inclus la réponse...

ça pourra servir pour une prochaine fois!

merci beaucoup à tous en tout cas!

--
*allophobe* : Qui a peur des différences. (Définition)

Avatar
Tr
*Ecrit* *par* **:
*Ecrit* *par* *Kalowycz*:
Le 07/03/2012 19:35, a écrit :

ok, j'ai mis tout mon ensemble de code dans un zip:
<http://www.tranquille-informatique.fr/perso/tempo/verif-logs.7z>
si tu as du temps, décompresse le tout dans un dossier puis lance
la
page testlog.php...



Salut,

J'avais un peu de temps en voyant ta réponse, alors j'ai jeté un
coup d'oeil, désolé pour SAM si je le court-circuite sur ce
coup-là. ;-)

A mon avis, tu galère pour rien au niveau de JS, bien qu'il soit
possible d'y arriver par ce biais.

Si tu utilise la temporisation de sortie (output buffering) sous
PHP, tu peux intervertir sans problème tes flux de sortie.

Je t'ai collé le code modifié de "test.php" sur ce lien temporaire
:
http://pastebin.com/zv4MbyRD

J'en ai profité pour cross-poster sur f.c.l.php, vu qu'on change de
problématique langagière !

Cdlt,
Kal



super, j'essayais au départ d'imaginer comment on pouvait renvoyer la
fin d'une page php au début en php, mais j'ai cru que ça n'était pas
possible, et bien ça l'est !!!

j'ai regardé vite fait le code, ce soir je n'ai pas le temps de
l'essayer.
si je comprends bien, j'enclenche la temporisation d'affichage,
ensuite je mets dans une variable le contenu de ma future page, puis
je nettoie, je mets la suite dans une autre, je nettoie, j'affiche en
inversant... la temporisation s'arrête toute seule en fin de script?
il n'y a pas de ob_stop?
(je viens de regarder l'aide d'ob_start et il y a des fonctions pour
arrêter: ob_end_flush(); faut-il en mettre une ou est-ce inutile?



argh je suis aveugle, j'ai loupé ob_end_clean();
tout y est, ya plus ka :-)

merci beaucoup...

par curiosité, j'aimerais quand-même savoir pourquoi en js ça n'y va
pas:
- comment faire pour accéder à la response et la modifier avant de
l'afficher
- et/ou, comment faire pour "rafraichir" la page sans la recharger
afin que le dom inclus la réponse...

ça pourra servir pour une prochaine fois!

merci beaucoup à tous en tout cas!



--
On n'est jamais trop bon, ce sont ceux qui en profitent qui sont trop
cons. (Réflexion)

Avatar
Kalowycz
Le 07/03/2012 21:36, a écrit :

par curiosité, j'aimerais quand-même savoir pourquoi en js ça n'y va pas:
- comment faire pour accéder à la response et la modifier avant de
l'afficher



Pas terrible, la doc de Mootools !
Elle précise que "responseTree" serait de type "element", alors qu'en
fait c'est une "nodeList".
De toute façon, ce n'est pas le type de réponse le plus pratique,
comparé à un "documentFragment".

Bref, du coup il faut deviner la place du bout de contenu rechercher
dans cet "arbre" (???).
J'ai fait qqes essais et remarqué que la méthode "adopt()" a l'air de
vider l'arbre, de sorte qu'il faut faire un traitement à la fois avant
et après si l'on veut changer l'ordre de présentation.

Voici un exemple pris dans le contexte de "onSuccess" :

<code>
$('messages').empty().removeClass('ajax-loading');
var enregistrement = responseTree.item(7);
$('affiche_logs').adopt(responseTree);
var aine = $('affiche_logs').firstChild;
$('affiche_logs').insertBefore(enregistrement, aine);
</code>

Ça a pour effet de replacer le contenu du DIV de classe "enregistrement"
au début de son parent, soit le DIV identifié "affiche_logs".

Je crois que tu cherchais qqe chose dans ce genre, non ?

Cdlt,
Kal

PS: j'ai viré le cross-posting PHP qui n'a plus lieu d'être ici.
Avatar
SAM
Le 07/03/12 21:06, Kalowycz a écrit :

J'avais un peu de temps en voyant ta réponse, alors j'ai jeté un coup
d'oeil, désolé pour SAM si je le court-circuite sur ce coup-là. ;-)



Ha ! Ben !
comme je ne comprends rien au PHP, je te le laisse volontiers ;-)

Quant au JS ... si c'est du Mootools qu'il faut absolument faire ...
j'avoue mon incompétence :-(

Faudra que je tente de suivre le cours que j'ai proposé à ,
histoire de comprendre à quoi ça peut bien servir.


--
Stéphane Moriaux avec/with iMac-intel
Avatar
SAM
Le 07/03/12 21:36, a écrit :

par curiosité, j'aimerais quand-même savoir pourquoi en js ça n'y va pas:
- comment faire pour accéder à la response et la modifier avant de
l'afficher



il faut que la réponse soit du XML (ou à minima un fragment)

- et/ou, comment faire pour "rafraichir" la page sans la recharger afin
que le dom inclus la réponse...



le + simple est d'avoir en réponse du texte-code-html
et on le place dans un div qui n'attend que ça sur la page affichée

$('div-d-affichage').innerHTML = responseText;

ça pourra servir pour une prochaine fois!



et si dans le code html inséré dans ce div il faut en déplacer un
élément (avec pour id : 'tempo' par exemple) en haut de page, on
continue avec :

document.body.insertBefore($('tempo'), document.body.firstChild);



--
Stéphane Moriaux avec/with iMac-intel
Avatar
Tr
*Ecrit* *par* *Kalowycz*:
Le 07/03/2012 19:35, a écrit :

ok, j'ai mis tout mon ensemble de code dans un zip:
<http://www.tranquille-informatique.fr/perso/tempo/verif-logs.7z>
si tu as du temps, décompresse le tout dans un dossier puis lance
la
page testlog.php...



Salut,

J'avais un peu de temps en voyant ta réponse, alors j'ai jeté un coup
d'oeil, désolé pour SAM si je le court-circuite sur ce coup-là. ;-)

A mon avis, tu galère pour rien au niveau de JS, bien qu'il soit
possible d'y arriver par ce biais.

Si tu utilise la temporisation de sortie (output buffering) sous PHP,
tu peux intervertir sans problème tes flux de sortie.

Je t'ai collé le code modifié de "test.php" sur ce lien temporaire :
http://pastebin.com/zv4MbyRD

J'en ai profité pour cross-poster sur f.c.l.php, vu qu'on change de
problématique langagière !

Cdlt,
Kal



ça marche impeccable, exactement ce qu'il me fallait...
me reste plus qu'à bien mettre en page, mille merci!!!

--
Rien n'est impossible. (Etat d'esprit)

1 2 3 4