Bonjour,
Nouveau membre sur le forum mais adepte des faqs de ce site depuis longtemps, je me permets de m'inscrire et de poster sur le sujet bouillant qu'est AJAX en ce moment.
Depuis le debut de la semaine, je fais un site en AJAX pour le boulot. L'utilisation d'AJAX est plus une lubie personnelle qu'une réel nécéssité, et m'a provoqué des maux de tête considérables, en particulier a cause à cause d'un "bug" d'innerHTML que l'ont rencontre aussi bien sous IE 6 que sous Firefox 1.504 : Le javascript contenu dans l'innerHTML remplacé n'est pas exécuté. et Eval ne corrige pas ce problème car les fonction évaluées ne sont pas pour autant disponibles pour le reste de la page. J'ai désesperement essayé des choses inefficaces ou totalement complexes et farfelues (coté serveur) avant de me dire qu'il devait y avoir un moyen d'y remédier en javascript.
j'ai trouvé ce topic qui proposait une solution qui me paraissait surdimensionnée. j'ai donc essayé d'écrire la mienne, mais je n'ai à ma disposition que IE6 firefox et opera 8.54. Ce dernier ne réagissant pas bien à ma fonction, en effet, suivant ce que je fais : soit opera n'execute pas le script, soit il l'execute 2 fois, soit il l'execute ... sans en copier le contenu !
les commentaires, bug, corrections, optimisations et autres sont les bienvenues.
A propos d'ajax, pour tous les adeptes de PHP je conseille très vivement le script disponible sur http://www.hemmady.com/ajaxagent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 function innerHTMLJS(obj,content) { /* Copyleft by GourouLubrik 2006 */ if(typeof(obj) != 'object' && typeof(content) != 'string') return; obj.innerHTML = content; var scripts = obj.getElementsByTagName('script'); if(scripts == false) return true; // no node script == no problem ! for (var i=0;i<scripts.length;i++) { var scriptclone = document.createElement('script'); if(scripts[i].attributes.length > 0) /* boucle de copie des attributs du script dans le nouveau node */ { for (var j in scripts[i].attributes) { if(typeof(scripts[i].attributes[j]) != 'undefined' && typeof(scripts[i].attributes[j].nodeName) != 'undefined' /* IE needs it */ && scripts[i].attributes[j].nodeValue != null && scripts[i].attributes[j].nodeValue != '' /* IE needs it ou il copie des nodes vides */) { scriptclone.setAttribute(scripts[i].attributes[j].nodeName,scripts[i].attributes[j].nodeValue); } } } scriptclone.text = scripts[i].text; // on copie le corp du script /* la j'ai pas compris, si je ne return pas sous opera ici : le javascript s'execute 2 fois - mais la : le script s'execute mais n'est pas a ce moment la placé entre les balises scripts ! et si je return juste après le innerHTML, le script n'est pas executé... ---o(< */ if (navigator.userAgent.indexOf("Opera")>0) { return; } /* on force le remplacement du node par dom, qui a pour effet de forcer le parsing du javascript */ scripts[i].parentNode.replaceChild(scriptclone,scripts[i]); } return true; }
je ne mets pas le reste de mon contenu php/js car il se base sur cette librairie.
Elle est absolument géniale, et la découverte de JSON est un bonheur pour convertir les objets PHP en javascript.
PS: Ne pas oublier de str_replace("\"","\\\"") vos contenus JSON sous peine de plantage instantané de votre navigateur =).
Partager