Annonce ToutSurTout

Bienvenue sur toutsurtout.biz

Déjà 15 ans !

Radio TST

Si vous souhaitez participer vous aussi aux discussions sur le forum, il faut vous inscrire ou vous identifier.

Le Thème TST Automne est maintenant en place.

Les inscriptions sont actuellement OUVERTES.

Message 1 Discussion postée le 07-11-2009 à 05:17:03

Solenne
Avatar de Solenne


Titre: Modératrice insomniaque
Avancement: Niveau 4
Lieu: Avec Loic
Date d'inscription: 26-09-2009
Messages: 6 834

Le DHTML

Introduction

Le Dynamic HTML est une extension du HTML qui, associée au javascript et aux feuilles de styles, permet de manipuler dynamiquement des éléments HTML sur une page. Le DHTML sans javascript ne sera jamais dynamique. C'est bien l'association avec le javascript qui lui donne vie.
La manipulation de ces éléments porte sur leur position, leur dimension, leur visibilité et leur style d'affichage (police, attributs de police, couleurs). Je vous invite à lire le tutorial sur les feuilles de styles.
Le mot dynamique de dynamic HTML signifie que les modifications peuvent se faire une fois que la page a fini de se charger, ce que ne permet pas le HTML classique. En HTML pur, une fois la page chargée et affichée, il n'est plus possible d'afficher de nouveaux éléments ou de les déplacer.

(In)Compatibilité
Le DHTML serait très intéressant à utiliser si il existait une norme officielle et suivie par les navigateurs. A l'heure actuelle, chaque navigateur gère le DHTML à sa façon. Ainsi, un script écrit pour un navigateur ne fonctionnera pas sur un autre sans un travail d'adaptation.
Le DHTML a été inventé par Netscape à partir de sa version 4. Microsoft a suivi cette voie en développant un autre langage de DHTML à partir de la version 4 de Internet Explorer. Actuellement, plus aucun internaute n'utilise de navigateur de version inférieure à la 4 ; donc tous les visiteurs peuvent profiter du DHTML.
Pour information, voici les proportions enregistrées sur le site Tout JavaScript.com en mars 2001 :
Internet Explorer 5 --> 86.5 %
Netscape Navigator 4.X --> 8.5 %
Internet Explorer 4 --> 4.3 %
Netscape Navigator 6 --> 0.4 %

Entre mars 2000 et mars 2001, la proportion était de :
Internet Explorer 5 --> 82.7 %
Netscape Navigator 4.X --> 10.4 %
Internet Explorer 4 --> 6.4 %

On note une augmentation progressive de la dominance de Internet Explorer 5. Netscape, toutes versions confondues, perd des parts de marché et Netscape 6 n'arrive pas à s'imposer.
Même si la grosse majorité utilise Internet Explorer 5, on ne peut pas négliger les utilisateurs de Netscape, environ 10% des visiteurs. Il est donc nécessaire de développer les scripts DHTML en tenant compte de cette minorité. Attention :
1 - ce tableau ne reflète pas la proportion générale, mais juste celle des visiteurs de Tout JavaScript.com.
2 - Le mot minorité utilisé pour les adeptes de Netscape n'est pas péjoratif, il représente simplement une réalité constatée.
3 - Le mot adepte n'est pas non plus péjoratif. Même si j'ai du mal à comprendre l'intérêt de ce navigateur...

Comment faire ?
La principale difficulté est causée par les incompatibilités entre navigateurs. On peut définir 3 grandes manières de gérer le DHTML pour les 2 grands navigateurs du marché : Internet Explorer et Netscape.
Internet Explorer 4 et Internet Explorer 5 sont compatibles.
Netscape 4.X utilise un langage propre incompatible avec Internet Explorer et Netscape 6.
Netscape 6 et Internet Explorer 5 sont compatibles.

Cela signifie en fait que :
Internet Explorer 4 a une notation qui lui est propre, mais que la version 5 supporte correctement.
Netscape 4.X est isolé.
Netscape 6 et Internet Explorer 5 respectent tous les 2 la norme officielle du W3C.
En contrepartie, Netscape 6 ne reconnaît plus le DHTML de ses versions antérieures.

Au final, 3 versions sont nécessaires pour assurer la compatibilité avec tous les navigateurs possibles :
Une version pour Internet Explorer 4,
Une pour Netscape 4,
Et une qui respecte la norme pour Netscape 6 et Internet Explorer 5.


https://www.world-lolo.com/images/uploads/image.num1351106986.of.world-lolo.com.gif
 

Message 2 Réponse postée le 07-11-2009 à 05:17:39

Solenne
Avatar de Solenne


Titre: Modératrice insomniaque
Avancement: Niveau 4
Lieu: Avec Loic
Date d'inscription: 26-09-2009
Messages: 6 834

Re: Le DHTML

Principe

Nous avons aperçu les difficultés que posait le DHTML. Voyons maintenant le principe de la programmation. Cette page présente les principes préconisés par la norme HTML, compatible donc avec Internet Explorer 5 et plus et Netscape 6.

Les objets du DHTML
En HTML, tous les éléments de la page sont considérés comme des objets de type différent. Les images, les liens, les formulaires, les champs de formulaires, etc sont des objets que le javascript peut déjà manipuler.
Le DHTML introduit la notion de calque ou couche ou layer.
Ces calques sont à la base du DHTML car ils vont pouvoir être manipulés : déplacés, cachés, modifiés, redessinés...
Un calque est défini par le couple de balises <DIV> et </DIV>
Les calques
Un calque doit posséder :
- un identifiant, pour le répérer
- un style d'affichage, pour indiquer sa position, sa taille, sa couleur, etc...
- un contenu, qui sera affiché
L'identifiant est enregistré grâce à l'attribut id. Sur une page, l'identifiant de tous les calques (et de tous les autres objets) doit être unique, pour éviter les ambiguités. Une erreur ne surviendra pas forcément en cas de doublons, mais le fonctionnement normal risque d'être perturbé.
Le style est enregistré grâce à l'attribut style. C'est une chaîne de caractères au format css (Voir la page sur les feuilles de style)
Le contenu est du code HTML (texte, tableaux, images...) placé entre les balises <DIV et </DIV>

Le code suivant place le tableau sur fond jaune contenant le texte Ceci est un calque dans un calque dont le coin supérieur gauche est à 200 pixels du haut de la page et à 100 pixels du bord gauche.
<DIV id="moncalque" style="position:absolute;top:200px;left:100px;visibility:hidden;background-color:yellow">
Ceci est un calque
</DIV>

Manipuler les calques avec Javascript
Ceci est un calque
Le calque peut être accédé par javascript grâce à la fonction document.getElementById qui retourne l'objet calque.
Manipulation de visibilité et de position
L'objet de type calque ainsi retourné a comme propriété un nouvel objet style qui contient toutes les propriétés d'affichage du calque : visibilité, position, dimensions, couleurs, ... Cet objet style est souvent manipulé dans le DHTML.
Cette ligne montre le calque identifié comme moncalque
  document.getElementById("moncalque").style.visibility="visible";

Cette ligne cache le calque identifié comme moncalque
  document.getElementById("moncalque").style.visibility="hidden";

Pour déplacer le calque, utilisez les propiétés top et left
  document.getElementById("moncalque").style.left=500;
  document.getElementById("moncalque").style.top=parseInt(document.getElementById("moncalque").style.top)+10;

Pour modifier la taille du calque, utilisez :
   document.getElementById("moncalque").style.width=parseInt(document.getElementById("moncalque").style.width)-20;

Attention, il n'est possible en javascript de modifier un attribut seulement si il a été défini dans la création du calque dans la zone de style de la balise DIV

Sur cette page, le calque moncalque est caché, cliquez sur les liens ci-dessous pour le rendre visible ou invisible.
Montrer le calque | Cacher le calque | Déplacer vers la gauche | Descendre
Rétrécir | Agrandir

Manipulation sur le style
Pour changer la couleur de fond, on utilise l'attribut backgroundColor
  document.getElementById("moncalque").style.backgroundColor="red";

On peut aussi changer la couleur du texte :
  document.getElementById("moncalque").style.color="blue";


https://www.world-lolo.com/images/uploads/image.num1351106986.of.world-lolo.com.gif
 

Message 3 Réponse postée le 07-11-2009 à 05:18:18

Solenne
Avatar de Solenne


Titre: Modératrice insomniaque
Avancement: Niveau 4
Lieu: Avec Loic
Date d'inscription: 26-09-2009
Messages: 6 834

Re: Le DHTML

Les navigateurs

Reconnaître les navigateurs
A cause de toutes les incompatibilités, il est indispensable de savoir reconnaître le navigateur du visiteur pour qu'il exécute la bonne partie de script, celle qui va fonctionner et qui ne va pas retourner d'erreur.

Pour reconnaître les navigateurs qui respectent la norme officielle HTML, il suffit de tester si la fonction getElementById est reconnue :
  if (document.getElementById) {
    // Navigateur qui supporte DHTML officiel
  }

Ici, si la fonction existe, le test est vrai.

De la même manière, pour tester Netscape de version 4.X, on utilise ce code :
  if (document.layers) {
    // Navigateur Netscape 4.X
  }

Ici l'objet layers est propre à Netscape 4.X. Ce test est vrai uniquement avec ce navigateur.

Pour reconnaître Internet Explorer 4, on utilise ce test :
  if ((document.all)&&(!document.getElementById)) {
    // Navigateur IE 4 uniquement
  }

Ici, all est un objet propre à Internet Explorer. Pour être sûr de ne pas détecter IE5 aussi, on vérifie en plus que la fonction getElementById n'est pas supportée.

Il peut être aussi utile de reconnaître les navigateurs qui ne supportent aucune des versions du DHTML. Le plus simple est d'écrire :   if ((!document.layers)&&(!document.all)&&(!document.getElementById)) {
    // Navigateur trop ancien !
  }

Les scripts DHTML du site
La première partie du tutorial est terminée. Vous pouvez faire une recherche sur tous les scripts utilisant le DHTML dans la base des scripts.


https://www.world-lolo.com/images/uploads/image.num1351106986.of.world-lolo.com.gif
 

Message 4 Réponse postée le 07-11-2009 à 05:19:20

Solenne
Avatar de Solenne


Titre: Modératrice insomniaque
Avancement: Niveau 4
Lieu: Avec Loic
Date d'inscription: 26-09-2009
Messages: 6 834

Re: Le DHTML

Assurer la compatibilité

Nous avons vu dans la première partie que les navigateurs minoritaires ne se comportent pas comme Internet Explorer (IE) 5 ou Netscape (NS) 6, qui respectent les normes officielles. Malheureusement, IE4 et NS4.X représentent encore plus de 10% des navigateurs. On ne peut donc pas les négliger, au risque de mécontenter une partie de l'audience du site.
La différence de programmation entre navigateurs est minime. C'est simplement l'accès aux objets calques qui diffèrent légèrement. Même si la différence de notation est peu importante, elle nécessite malgré tout de détecter le navigateur et de traiter le calque comme il convient. Cela revient à dupliquer le code.

Internet Explorer 4
IE4 ne reconnaît pas la fonction getElementById(). Tous les objets sont accessibles par le tableau d'objets all. Par exemple, pour accéder au calque moncalque, on écrit :
  document.all["moncalque"]

Les propriétés dans l'objet style existent aussi dans IE4. Par exemple, width, height, color... L'accès à ces propriétés se fait donc par :
  document.all["moncalque"].style.width=100;

REM : Cette notation est également comprise et correctement interprétée par IE5 et plus.

Netscape 4.X
NS4 ne reconnaît pas non plus la fonction getElementById(). L'accès aux objets calque se fait par le tableau layers qui fonctionne comme l'objet all en étant propre à Netscape :
  document.layers["moncalque"]

Netscape a introduit une nouvelle balise propriétaire <LAYER>. Avec NS4, on peut donc déclarer un calque de 2 manières :
  <DIV id="moncalque" style="width:100;height:100;left:500;top:80">

Ou avec la balise <LAYER>
  <LAYER name="moncalque" left=500 top=80 width=100 height=100>

Cette double notation rend l'accès aux propriétés de style différent. On n'utilise pas l'objet style ; l'accès est direct. Pour la largeur du calque, on écrit : <<document.layers["moncalque"].width=100;

REM :
- Une propriété n'existe que si elle a été déclarée dans la balise <DIV> ou <LAYER>.
- Netscape 6 a complétement abandonné la gestion des layers. Ainsi, aucun script DHTML pour NS4 ne peut fonctionner sur NS6 sans adaptation. Voilà une faàon de faire évoluer ses produits discutable : Assurer la compatibilité avec les versions antérieures demande du travail de développement et de test, mais accélère l'installation de la dernière version par les utilisateurs et évite aux développeurs des mises à jour fastidieuses et inutiles.
En agissant ainsi, Netscape s'attire la colère des développeurs et des webmasters et risquent de retarder l'implantation de sa dernière version, en perdant encore plus de parts de marché.


https://www.world-lolo.com/images/uploads/image.num1351106986.of.world-lolo.com.gif
 

Message 5 Réponse postée le 07-11-2009 à 05:20:54

Solenne
Avatar de Solenne


Titre: Modératrice insomniaque
Avancement: Niveau 4
Lieu: Avec Loic
Date d'inscription: 26-09-2009
Messages: 6 834

Re: Le DHTML

Assurer la compatibilité

Nous allons dans cette page détailler le fonctionnement du Dynamic HTML du script : Un calque toujours visible.

Objectif du script
Ce script permet de positionner un calque en haut de page, toujours visible, quelles que soient les actions du visiteur sur l'ascenseur.
Ce script est très utile pour afficher un logo ou un menu accessible en permanence par les visiteurs, même si la hauteur de la page dépasse celle de l'écran.
Pour tester ce script, utilisez l'ascenceur vertical et observez le logo en bas de la page.

Principe de fonctionnement
Les navigateurs ne possèdent pas l'événement onScroll qui détecterait l'action du visiteur sur les ascenseurs et le défilement de la page.
On utilise donc une astuce de programmation : un timer est déclenché pour scruter à intervalle régulier la position de la page et pour déplacer ainsi le calque afin de le maintenir toujours visible.
Pour limiter les saccades dû au déplacement du calque, le calque est déplacé progressivement, par incrément, vers sa position normale.

Explication du script
Voici le code source du script :

<SCRIPT language="javascript">
// PARAMETRAGE DU SCRIPT
var tjs_delai=30;
var tjs_max=50;
var tjs_mode=1; // 0 - calque toujours en haut de page / 1 - calque en bas

// LE RESTE NE CHANGE PAS
var tjs_hauteur=0;
function PrintCalque(left,top,width,height,contenu) {
    tjs_hauteur=height;
    if ((document.all)||(document.getElementById)) {
        var Z="<DIV id='tomber' style='position:absolute;left:"+left+";top:"+top+";width:"+width+";height:"+height+"'>"+contenu+"</DIV>";
    } else {
        var Z="<LAYER name='tomber' left="+left+" top="+top+" width="+width+" height="+height+">"+contenu+"</LAYER>";
    }
    document.write(Z);
    setTimeout("Start()",tjs_delai);
}
function Start() {
    // Toujours en haut :
    //var delta=parseInt(document.getElementById("tomber").style.top-document.body.scrollTop);
    MoveLayer("tomber",GetTop("tomber"));
    setTimeout("Start()",tjs_delai);
}
function Debug() {
    var obj=document.body
    var Z="";
    for (var i in obj) {
        Z+=i+"="+obj[i]+"\n";
    }
    alert(Z);
}
function MoveLayer(nom,top) {
    if (document.getElementById) { //IE5 et NS6
        document.getElementById(nom).style.top=top;
    }
    if ((document.all)&&(!document.getElementById)) { //IE4 seul
        document.all[nom].style.top=top;
    }
    if (document.layers) { //NS4.X seul
        document.layers[nom].top=top;
    }
}
function GetTop(nom) {
    // Partie 1 : Récupération de la position du calque et de la page
    if (document.getElementById) { //IE5
        var pos=parseInt(document.getElementById(nom).style.top);
        var wintop=parseInt(document.body.scrollTop);
        var avail=document.body.clientHeight;
    }
    if ((document.getElementById)&&(!document.all)) { //NS6
        var pos=parseInt(document.getElementById(nom).style.top);
        var wintop=parseInt(window.pageYOffset);
        var avail=window.innerHeight;
    }
    if ((document.all)&&(!document.getElementById)) { //IE4 seul
        var pos=parseInt(document.all[nom].style.top);
        var wintop=parseInt(document.body.scrollTop);
        var avail=document.body.clientHeight;
    }
    if (document.layers) { //NS4.X seul
        var pos=parseInt(document.layers[nom].top);
        var wintop=parseInt(window.pageYOffset);
        var avail=window.innerHeight;
    }

    // Partie 2 : Traitement de la position
    if (tjs_mode==0) { // toujours en haut
        var delta=Math.ceil((pos-wintop)/3);
        if (delta>20) {delta=20;}
        if (delta<-20) {delta=-20;}
        var top=pos-delta;
    }
    if (tjs_mode==1) {// toujours en bas
        var delta=Math.ceil((pos-(wintop+avail-tjs_hauteur)));
        if (delta>tjs_max) {delta=tjs_max;}
        if (delta<-1*tjs_max) {delta=-1*tjs_max;}
        var top=pos-delta;
    }
    return top;
}

</SCRIPT>

Paramétrage du script
Le paramétrage du script se fait dans les premières lignes de code :
tjs_delai contient le délai du timer, soit le temps en millisecondes entre chaque vérification de la position du calque.
tjs_max contient le déplacement maximal en nombre de pixels du calque par intervalle de temps.
tjs_mode contient le mode d'affichage : 0 signifie que le calque sera toujours en haut et 1 toujours en bas.

Création du calque
Pour assurer la compatibilité entre tous les navigateurs, une fonction de création de calque a été définie PrintCalque(). Elle attend en paramètres la position et la taille du calque ainsi que la chaîne HTML qui sera affichée dans ce calque. Dans notre cas, il s'agit d'un logo du site.
Cette fonction affiche le code HTML correspondant sur la page selon le navigateur en cours et crée ainis un calque appelé tomber.
Le timer qui scrute la position du calque est lancé par setTimeout("Start()",tjs_delai); de la fonction PrintCalque().
Pour être sûr que le calque recouvre bien tous les éléments de la page, l'appel à PrintCalque(100,100,100,100,"TJS"); est placé à la fin de la page, juste avant la balise </BODY>.

Le timer
Le timer déclenche à intervalle régulier l'appel à la fonction Start() qui repositionne le calque à chaque passage. Le délai du timer est dans la variable tjs_delai, exprimé en millisecondes. Plus le délai est court, plus le calque sera replacé rapidement. En contrepartie, un délai court consomme du temps de traitement et peut ralentir un PC de petite puissance.
La fonction Start() contient 2 lignes :
MoveLayer("tomber",GetTop());
setTimeout("Start()",tjs_delai);
MoveLayer() est détaillée au prochain paragraphe. La 2ème ligne sert à maintenir le timer en fonctionnement.

Les fonctions de déplacement
La fonction MoveLayer() attend 2 paramètres, le nom du calque à déplacer et la position verticale.
Le nom du calque est tomber, la position du calque est calculée par la fonction GetTop() On utilise une fonction ici qui détecte le navigateur et qui gère la compatibilité entre navigateurs automatiquement. Ainsi, pour déplacer un calque, on ne se préoccupe pas de connaître le navigateur, on appelle juste MoveLayer().
Si le navigateur est IE5 ou NS6, on utilise la fonction getElementById() pour accéder au calque et lui affecter sa position verticale.
Si le navigateur est IE4, on utilise l'objet all.
Pour Netscape 4.X, on utilise l'objet layers.

La position du calque
La fonction GetTop() attend en paramètre le nom du calque à positionner.
Le corps de la fonction est découpée en 2 parties.
La première partie récupère, selon le navigateur, la position actuelle du calque dans la variable pos, la position de la page dans wintop et la hauteur utilisable de la page dans avail.
La deuxième partie réalise le calcul de la position en fonction du mode d'affichage.
Si tjs_mode vaut 0, le calque doit être toujours en haut. Sinon, le calque doit être en bas. La variable delta contient le nombre de pixels dont le calque doit se déplacer. Le maximum de déplacement est dans la variable tjs_max. Elle permet de limiter la vitesse de déplacement du calque et de le rendre ainsi plus lisse et moins saccadé.

Améliorations possibles
La première amélioration qui vient à l'esprit est d'ajouter la possibilité de faire coller le calque en horizontal, toujours sur un côté, à droite ou à gauche.
On peut aussi imaginer une gestion plus amusante du déplacement du calque, avec par exemple un rebond sur le bas de la page.


https://www.world-lolo.com/images/uploads/image.num1351106986.of.world-lolo.com.gif
 

Message 6 Réponse postée le 07-11-2009 à 06:37:13

iznogood
Avatar de iznogood


Titre: VIP
Avancement: Niveau 2
Lieu: Reims
Date d'inscription: 27-09-2009
Messages: 2 308
Site web

Re: Le DHTML

Tiens t'as Amaya pour faire; gratuit > multilanguage et multiplateforme ici


https://www.world-lolo.com/images/uploads/image.num1359778475.of.world-lolo.com.gif