11544 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je travaille sur une application métier, réalisée entièrement en PHP, utilisant Javascript. L'application est pour un intranet.
Sur une partie du développement que je réalise, je dois remplir les cases d'un tableau HTML dont la structure est assez complexe. Au hasard de mes recherches sur internet, je suis tombé sur un article dans ce forum qui traitait de l'utilisation de innerHTML. Dans une réponse, il était évoqué, dans les grandes lignes, l'utilisation de "template" : une partie du code HTML était cachée dans la page même, puis grâce à la fonction replace, certaines parties étaient remplacée; Au final, on utilisait innerHTML pour "coller" le nouveau code à l'écran.
Le principe m'a beaucoup plus, surtout en considérant le cas sur lequel j'atais. J'aurais bien aimé trouvé quelques exemples de mise en oeuvre de ce principe. Mais les rares contributions que j'ai trouvé sur le net se limitaient à vous renvoyer à la documentation de DOM...
De mon côté, j'ai pu finir mon développement beaucoup plus rapidement que prévu.
Mais je suis toujours intéressé par cette méthode pour la creuser et l'utiliser au mieux.

Est-ce quelqu'un aurait quelques exemples concrets ou tutoriaux ?

Merci Smiley cligne
Bonjour,

Il faudrait que tu décrives plus précisément ce que tu souhaites faire. À vue de nez, c'est de la manipulation du DOM, donc les renvois vers une documentation sur la manipulation du DOM en JavaScript me semblent pertinents.

Si tu souhaites te faciliter un peu la vie, tu peux éventuellement utiliser une bibliothèque JavaScript qui facilite la manipulation du DOM. Je pense notamment à jQuery.

Pour l'utilisation de «templates», là ça m'échappe un peu. À part faire une chaine de caractères qui contient un code HTML et y insérer les valeurs de variables, et insérer le tout dans un document via innerHTML, je ne vois pas trop ce que ça peut recouvrir.

Questions en vrac:
1. Description précise de la fonctionnalité souhaitée?
2. Tu as prévu un fonctionnement sans JavaScript (via PHP uniquement avec rechargement de la page)?
2. Quelles sont es compétences en JavaScript? Utilises-tu un bibliothèque particulière?
Florent V. a écrit :
Bonjour,

Il faudrait que tu décrives plus précisément ce que tu souhaites faire. À vue de nez, c'est de la manipulation du DOM, donc les renvois vers une documentation sur la manipulation du DOM en JavaScript me semblent pertinents.


Bonjour Florent,

Mon besoin est somme toute assez simple.
Comme je l'expliquais, j'ai un tableau HTML assez complexe dont je souhaite mettre à jour le contenu des cellules. Le contenu est calculé "à la volée" par du javascript associé avec de l'Ajax. En gros, ce tableau est un résumé d'informations financières que l'utilisateur a rempli dans la page.
Actuellement, j'ai créé un fichier qui contient le code HTML du tableau. J'ai identifié le contenu des cellules qui m'intéressent par des pseudos variables (%montant%, %capital%,...).
Voici un exemple succint de ce que pourrait être mon modèle :

<table>
  <tr>
    <td>Montant de la prime</td>
    <td>%montantPrime%</td>
  </tr>
</table>


Le fichier HTML subit en fait deux niveaux de modification :
- d'abord par le PHP. A ce niveau, je remplace certaines "variables" qui ne sont pas influencées par les choix de l'utilisateur dans la page et qui donc n'ont pas besoin d'être faite par le Javascript. Pour fixer cette idée, c'est comme si mon modèle devait faire apparaître l'adresse IP ou la date du jour. Quoi que fasse l'utilisateur, la date du jour ou son IP ne changent pas (heu, svp, c'est un EXEMPLE, donc, pas la peine de me faire une longue explications sur le fait que l'utilisateur peut être devant son écran à 23h59 ou qu'au même moment le bail de son IP a expiré Smiley lol ), donc je peux les renseigner au moment de la création de la page HTML.

$template = file_get_contents("analyse_tmpl.html");
/*
 .....
  ici, modifications sur le contenu de $template, faites par le PHP
 ....
*/

echo "<div class='template' id='modeleResume'>";			
/*
 * Modèle du tableau qui sera modifié à la volée par le Javascript
 */
echo $template;
echo "</div>";

echo "<div id='divResume'>";
echo "</div>";


- ensuite par le javascript. Là, je prends en compte "en live" les changements faits par l'utilisateur.

template = document.getElementById("modeleResume").innerHTML;
cResume = document.getElementById("divResume");

// Calculs et autres trucs en javascript...

template = template.replace("%montantPrime%",_montantDeLaPrime);

cResume.innerHTML = template;


Voila mon code édulcoré. Cependant, c'est un peu "bourrin". Certes, ça marche si on prend la peine de bien écrire son code JS et de le "blinder" (terme un peu déplacé quand il s'agit de JS, mais qui consiste à essayer de prévoir tous les cas de figure afin d'éviter un plantage du à une variable non initialisée et j'en passe... Smiley rolleyes ).

Florent V. a écrit :

Si tu souhaites te faciliter un peu la vie, tu peux éventuellement utiliser une bibliothèque JavaScript qui facilite la manipulation du DOM. Je pense notamment à jQuery.


J'aurais aimé savoir s'il y a une méthode plus "propre" , voire plus rapide en terme de temps d'exécution. En fouillant, j'ai cru lire que le remplacement dans le innerHTML était bien moins rapide que la manipulation directement via le DOM.
J'ai choisi ce système de template, car il m'évitait d'avoir à concevoir mon tableau HTML en l'écrivant à la main en PHP, puis en m'obligeant ensuite en JS à aller chercher le contenu de chaque "<td>" dont je souhaite modifier le contenu. Là, si je veux modifier la structure de mon tableau, je vais juste dans le fichier HTML du template. Les cas que j'ai pu lire qui utilisent le DOM créent de toute pièce tout le tableau ! Donc finalement, c'est déshabiller Pierre pour habiller Paul : j'évite de le créer en PHP pour le créer en JS !

Florent V. a écrit :

Pour l'utilisation de «templates», là ça m'échappe un peu. À part faire une chaine de caractères qui contient un code HTML et y insérer les valeurs de variables, et insérer le tout dans un document via innerHTML, je ne vois pas trop ce que ça peut recouvrir.


Bah, le terme est très certainement pompeux (je ne revendique pas son origine, car repris de l'article d'origine, mais je le trouve assez proche de la réalité toutefois).

Florent V. a écrit :

Questions en vrac:
1. Description précise de la fonctionnalité souhaitée?


Je pense avoir répondu à ta question dans mon loooong développé. Mais si ça ne suffit pas, n'hésite pas !

Florent V. a écrit :

2. Tu as prévu un fonctionnement sans JavaScript (via PHP uniquement avec rechargement de la page)?

Le dévelopement initial avait été fait sans JS, mais cela n'était pas judicieux pour cet écran. En effet, l'affichage et la présentation de la page doivent refléter rapidement les choix de l'utilisateur pour l'aider. Or, seul JS et Ajax me permettent cette souplesse.

Florent V. a écrit :

2. Quelles sont es compétences en JavaScript? Utilises-tu un bibliothèque particulière?

Ah ! J'ai à mon actif quelques colères mémorables contre quelques points virgules furtifs ou problème de compatiblité IE/FF. Sinon, plus sérieusement, j'ai développé quelques "classes" en JS et j'en fais régulièrement. Mais à mon grand plaisir, je découvre tous les jours de nouvelles fonctionnalités et usages qui me font amèrement regretter des fois de ne pas les avoir connues plus tôt (perfectionniste que je suis... Smiley bawling ). J'ai eu mon diplome "alert('hello world');" avec mention Smiley lol .
Le DOM, j'en mange un peu à toutes les sauces, et c'est justement les "sauces" qui me restent sur l'estomac, car cuisinées n'importe comment ! J'aime bien un petit exemple simple qu'une longue doc théorique qui enfonce des portes ouvertes (du genre "getChild()" => obtient le Child ... T'es content avec ça... bon d'un autre côté, s'il n'y a rien d'autre à dire Smiley rolleyes ....)
Salut marcmendez,

En fait c'est deux utilisations différentes, dans le cas ou tu travailles avec des noeuds c'est que tu charges un fichier json ou xml, que tu vas parser. Tu vas le parser pour pouvoir effectuer des opérations dessus avec ton javascript, c'est à dire que tu peux par exemple associer des événements javascript aux nouveaux noeuds créer, ou bien afficher ou non des éléments en fonction d'actions de l'utilisateur. C'est très pratique par exemple pour génerer des selectbox dynamique ou gérer le chargement des images.

Si tu affiche du html tel quel alors innerHTML reste beaucoup plus simple, en effet tu t' évites de parser ton fichier json ou xml et d'imbriquer des fonctions DOM pour recréer tout tes noeuds. A mon avis c'est même bien plus rapide.

Après c'est aussi au cas par cas, si tu as juste quelques variables qui change dans ton tableau, tu peux aussi assigner des classes a tes éléments td et actualiser que ceux ci à partir d'un fichier json ou xml...
Modifié par matmat (08 Jun 2009 - 17:17)
Hello,

Merci pour les précisions.

Mes connaissances JS à moi sont limitées donc je ne suis pas sûr de faire avancer le schmilblick. S'il y a effectivement des problèmes de performance avec innerHTML, ce sera surtout sur des grandes quantités d'opérations, ou sur des opérations qui s'enchainent rapidement. Pour changer un contenu pas excessivement volumineux toutes les quelques secondes ou sur action ponctuelle de l'utilisateur, ça ne devrait pas être gênant.

L'alternative, ce serait de récréer l'arbre DOM du tableau complet dans une variable, et pour finir de faire un appendChild qui va bien… ça peut être plus rapide, mais c'est ô combien plus fastidieux.

Après ça dépend de l'ampleur du tableau et de la quantité de données qui changent. Si tu as quatre informations à mettre à jour, modifier directement le contenu des cellules marche bien. Si c'est plus d'une dizaine d'infos, ça devient assez pénible. Enfin il semblerait que tu as déjà tranché cette question. Smiley cligne

Une «amélioration» qui me semble possible, ce serait d'éviter de stocker le template comme contenu HTML, surtout s'il y a des objectifs ou contraintes d'accessibilité pour ce site. Un display:none en CSS ne suffit pas à garantir que ce faux contenu ne sera pas perçu par l'utilisateur. Les autres solutions (un exemple) ne sont pas forcément intéressantes ou peuvent être trop lourdes à mettre en place, bien sûr, auquel cas le fonctionnement actuel serait correct.
Florent V. a écrit :
Hello,

Merci pour les précisions.

Mes connaissances JS à moi sont limitées donc je ne suis pas sûr de faire avancer le schmilblick. S'il y a effectivement des problèmes de performance avec innerHTML, ce sera surtout sur des grandes quantités d'opérations, ou sur des opérations qui s'enchainent rapidement. Pour changer un contenu pas excessivement volumineux toutes les quelques secondes ou sur action ponctuelle de l'utilisateur, ça ne devrait pas être gênant.


Que néni, toute opinion est bonne à prendre. Comme tu l'as indiqué, j'ai déjà fait mon choix puisque mon développement fonctionne. Je cherche juste à l'améliorer ou à faire mieux si la prochaine fois je dois faire quelque chose de similaire.

Florent V. a écrit :

L'alternative, ce serait de récréer l'arbre DOM du tableau complet dans une variable, et pour finir de faire un appendChild qui va bien… ça peut être plus rapide, mais c'est ô combien plus fastidieux.

Comme tu le dis, très fastidieux. C'est pas que j'ai forcément la flegme, mais franchement, la valeur ajoutée de ce genre de travail sur un tableau contenant 26 variables à modifier est proche du zéro... Et je n'ai pas stagiaire sous la main pour lui refiler la besogne Smiley cligne ... Effectivement, sur des petits tableaux, ça peut le faire.

Florent V. a écrit :

Une «amélioration» qui me semble possible, ce serait d'éviter de stocker le template comme contenu HTML, surtout s'il y a des objectifs ou contraintes d'accessibilité pour ce site. Un display:none en CSS ne suffit pas à garantir que ce faux contenu ne sera pas perçu par l'utilisateur. Les autres solutions (un exemple) ne sont pas forcément intéressantes ou peuvent être trop lourdes à mettre en place, bien sûr, auquel cas le fonctionnement actuel serait correct.


J'ai gardé sous le coude le JQuery, car j'en entends beaucoup parlé; Il faut juste que je m'y penche avant de passer à côté de quelque chose de très intéressant peut-être et de me rendre compte que je n'arrête pas de réinventer la roue....
Pour le display:none, certes, on peut toujours voir le contenu avec certains navigateurs qui permettent de modifier dynamique le comportement des CSS. Dans une application plus généraliste, je suis d'accord. En ce qui me concerne, j'ai le "confort" d'être en Intranet, avec des utilisateurs lambda.
J'ai développé une mini classe en JS qui me permet de faire communiquer rapidement JS avec PHP. En fait, le JS donne un "ordre" à une page PHP, et en retour donne le résultat du traitement. Cela m'est très utile dans mon cas, car j'ai des calculs qui doivent être réalisées selon les même règles en JS et en PHP. Ainsi, je n'ai qu'un seul exemplaire de mon calcul (plus souple d'ailleurs en PHP...) pour la maintenance. J'aurais pu éventuellement utiliser cette classe pour aller chercher le contenu de mon "template" (sachant qu'il doit être pré-traité par le PHP).