Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Je me permets de poster ce sujet qui n'a que partiellement à voir avec les sujets de ce forum. Sauf que le site que je développe est réalisé avec le sympathique ZF. J'utilise également prototype.
Voici le code de mon header :
<script src="/public/scripts/prototype.js" type="text/javascript"></script> {literal} <script type="text/javascript"> function getComments(id,chemin){ var url = 'http://www.tschtong.fr/'+chemin+'/comments'; var myAjax = new Ajax.Updater ('comment'+id, url, { evalScripts:true, onLoading:function(request){$('spinner'+id).show()}, onComplete:function(){$('spinner'+id).hide()}, parameters: 'id_pos='+id, method:'get' }); } function closeComments(id){ $('comment'+id).innerHTML=""; $('spinner'+id).hide(); } function postComment(id,chemin){ var url = 'http://www.tschtong.fr/'+chemin+'/postcomment'; var parametres = 'id_pos='+id; var myAjax = new Ajax.Request ( url, { onLoading:function(request){$('spinner'+id).show()}, parameters: parametres, method:'get', onSuccess : function(response){ var renderDiv = $('comment'+id); renderDiv.innerHTML = response.responseText; $('spinner'+id).hide(); } }); } </script> {/literal}
Le problème vient de ma notification de chargement pendant la requête (le spinner) . Sur le onLoading il s'affiche mais refuse quasi systématiquement de se refermer sous IE sur le onComplete. Quelque fois il se ferme bien. Sous Firefox je n'ai aucun problème. J'ai recherché sur le web diverses réponses, mais je n'ai pas trouvé de solutions. Le problème existe pour Ajax.Updater et pour Ajax.Request. Pourtant, Element.Hide fonctionne parfaitement pour d'autres styles de requêtes. Donc le onComplete pourrait poser problème. Que faire ? Si vous avez déjà rencontrer ce problème et si vous avez une solution, je suis preneur !
PS. : La réponse du serveur marche cependant de façon impeccable.
Merci à vous.
A+Tschtong.
Hors ligne
Pour le loading, tu peut utiliser onLoading() pour afficher le spinner, et onLoaded() pour le cacher, cependant ces méthodes ne sont pas garanties, selon la doc officielle. (http://prototypejs.org/api/ajax/options)
Personnelement, j'utilise onLoading() pour afficher le spinner, et, dans onSuccess(), je le cache, et cela a toujours fonctionner sous mFF et IE.
Tu testes sous IE 6 ?
Dernière modification par Phoenix17 (24-12-2007 17:50:18)
Hors ligne
Salut, merci de ta réponse j'ai essayé avec les différents états : onLoaded, onComplete, onSuccess, rien à faire...
Sous IE, le spinner s'affiche et se cache bien au premier coup, mais au 2éme, 3éme, 4ème etc coup le spinner s'affiche bien sur le onLoading, mais reste afficher ensuite. Par contre j'ai testé avec les autre navigateurs (Opera & Safari) ca marche nickel. J'ai pas testé sous IE6 ):
A+ tschtong
Hors ligne
Donc c'est dans IE 7 que tu testes ?
Est'ce que au moins, ta requête ajax te retourne quelques chose dans le onSuccess ?
Car je trouverais cela bizarre que le spinner ne se cache pas si tu met ta ligne de code permettant de le cacher dans le onSuccess, et que ta requête fonctionne.
Si tu bosses sur IE 7, il existe des extensions te permettant de débugger ton javascript un peu comme FireBug sous Firefox (bien que ce dernier est le meilleur, je pense).
Cependant, à ma connaissance, la plupart des extensions IE sont payantes, il me semble qu'il en existe en free, mais je ne saurais te dire le nom.
J'ai vu que tu utilises les methodes Element.Show() et Element.Hide() de prototype.
A titre de test, tu peut toujours essayer de les remplacer par $(element).style.display = '' et $(element).style.display = 'none'.
Je viens de voir que dans ton code, il y a une balise de chargement 'spinner{id}' par requête.
Dans ce cas, j'imagine que tu fais le nécessaire au préalable pour créer les
<div id="spinner{id}">Chargement...</div>.
Si tes elements 'spinner{id}' font partie intégrante du résultat de ta reqûete (cad qu'il font partie de ta réponse ajax), le problème peut venir de là, car pendant le onLoading(), le réponse n'est pas encore arrivée et donc l'action ne peut être effectuée.
Je ne sais pas comment tu fait intéragir l'ensemble, mais en regardant ton exemple, j'imagine que tu fait une reqûete sql / ajax par commentaire.. ?
Si, oui, tu pourrais largement optimiser tout ça en faisant une seule requête sql qui récupère tous les commentaires, tu transmet ensuite en les données en json pour les récupèrer dans ton onSuccess.
Ainsi, tu pourrais faire un boucle en javascript, qui créer chaque commentaire en html (avec dom par exemple).
Et donc, tu ne ferais qu'une seule requete SQL, et une seule AJAX.
Bon courage
Dernière modification par Phoenix17 (26-12-2007 23:01:16)
Hors ligne
Cependant, à ma connaissance, la plupart des extensions IE sont payantes, il me semble qu'il en existe en free, mais je ne saurais te dire le nom.
Y'a la "Internet Explorer Dev Toolbar" officiel déjà . Après j'suis pas allé voir plus loin.
Hors ligne
Bonjour tschtong,
Tu peux mettre des traces (alert ou autre) entre les lignes
alert ("toto1"); var renderDiv = $('comment'+id); alert ("toto2"); renderDiv.innerHTML = response.responseText; alert ("toto3"); $('spinner'+id).hide(); alert ("toto4");
Tu verras où s'arrête ton code, la spécialité de IE est de s'arrêter sans rien dire (pas d'erreur, aucune trace,...)
Je parie sur un problème autour du innerHTML qui dans certain cas a des comportements bizarres... si tu utilises prototype, il faudra peut-être regarder du coté de Insertion.Top & co...
Sinon comme outil de débug, tu as : companionJS (gratuit) et la debugBar (payant mais pas cher et en éval pendant 30 jours gratos) qui sont assez géniaux.
A+, Philippe
Hors ligne